1.前言

当决定前端与后端代码分开部署时,发现shiro自带的session不起作用了。

然后通过对请求head的分析,然后在网上查找一部分解决方案。

最终就是,登录成功之后,前端接收到后端传回来的sessionId,存入cookie当中。

之后,前端向后端发送请求时,请求Head中都会带上这个sessionid。

后端代码通过对这个sessionid的解析,拿到正确的session。

2.代码改造

(1)后端代码改造

  1. 添加CustomSessionManager.java

    /**
    * 类的详细说明
    *
    * @author 郭广明
    * @version 1.0
    * @Date 2018/11/3014:56
    */
    public class CustomSessionManager extends DefaultWebSessionManager { /**
    * 获取请求头中key为“Authorization”的value == sessionId
    */
    private static final String AUTHORIZATION ="Authorization"; private static final String REFERENCED_SESSION_ID_SOURCE = "cookie"; /**
    * @Description shiro框架 自定义session获取方式<br/>
    * 可自定义session获取规则。这里采用ajax请求头 {@link AUTHORIZATION}携带sessionId的方式
    */
    @Override
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
    // TODO Auto-generated method stub
    String sessionId = WebUtils.toHttp(request).getHeader(AUTHORIZATION);
    if (StringUtils.isNotEmpty(sessionId)) {
    request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE);
    request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sessionId);
    request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
    return sessionId;
    }
    return super.getSessionId(request, response);
    } }
  2. 改造ShiroConfig.java

    @Configuration
    public class ShiroConfig { @Autowired
    private UserService userService; @Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); // 必须设置 SecurityManager
    shiroFilterFactoryBean.setSecurityManager(securityManager); // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
    shiroFilterFactoryBean.setLoginUrl("/login"); // 拦截器.
    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
    // 配置不会被拦截的链接 顺序判断
    filterChainDefinitionMap.put("/static/**", "anon");
    filterChainDefinitionMap.put("/doLogin", "anon");
    filterChainDefinitionMap.put("/swagger-resources", "anon");
    filterChainDefinitionMap.put("/v2/api-docs", "anon");
    filterChainDefinitionMap.put("/webjars/**", "anon");
    filterChainDefinitionMap.put("/swagger-ui.html", "anon"); // <!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
    // <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
    filterChainDefinitionMap.put("/**", "anon"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
    System.out.println("Shiro拦截器工厂类注入成功");
    return shiroFilterFactoryBean;
    } /**
    * 注入MyRealm
    * @return
    */
    @Bean
    public SecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    // 设置realm.
    securityManager.setSessionManager(sessionManager());
    securityManager.setRealm(myShiroRealm());
    return securityManager;
    } /**
    * 配置注解
    * @param securityManager
    * @return
    */
    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor
    = new AuthorizationAttributeSourceAdvisor();
    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
    return authorizationAttributeSourceAdvisor;
    } @Bean
    public MyRealm myShiroRealm() {
    return new MyRealm(userService);
    } @Bean("sessionManager")
    public SessionManager sessionManager(){
    CustomSessionManager manager = new CustomSessionManager();
    /*使用了shiro自带缓存,
    如果设置 redis为缓存需要重写CacheManager(其中需要重写Cache)
    manager.setCacheManager(this.RedisCacheManager());*/ manager.setSessionDAO(new EnterpriseCacheSessionDAO());
    return manager;
    } }

(2)前端代码改造

  1. 添加CookieUtil.js

    export default {
    setCookie: (name,value,days) =>{
    var d = new Date;
    d.setTime(d.getTime() + 24*60*60*1000*days);
    window.document.cookie = name + "=" + value + ";path=/;expires=" + d.toGMTString();
    },
    getCookie: name =>{
    var v = window.document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
    return v ? v[2] : null;
    },
    delCookie: name =>{
    this.setCookie(name, '', -1); //将时间设置为过去时,立即删除cookie
    } }
  2. 改造HttpUtil.js

    import axios from 'axios'
    import doCookie from '@/util/cookieUtil' axios.defaults.headers.common['Authorization'] = doCookie.getCookie("SESSIONID")
    axios.defaults.baseURL = 'http://127.0.0.1:8080' /**
    * Get请求
    */
    export function get(url, callback){
    axios.get(url)
    .then(function (response) {
    if(response.data.length==0 || response.data==null) {
    callback(null,true)
    } else {
    callback(response.data,true)
    }
    })
    .catch(function (error) {
    callback(null,false)
    })
    } export function remove(url, callback){
    axios.delete(url)
    .then(function (response) {
    if(response.data.length==0 || response.data==null) {
    callback(null,true)
    } else {
    callback(response.data,true)
    }
    })
    .catch(function (error) {
    callback(null,false)
    })
    } export function post(url, data, callback){
    axios.post(url,data)
    .then(function (response) {
    if(response.data.length==0 || response.data==null) {
    callback(null,true)
    } else {
    callback(response.data,true)
    }
    })
    .catch(function (error) {
    callback(null,false)
    })
    } export function put(url, data, callback){
    axios.put(url,data)
    .then(function (response) {
    if(response.data.length==0 || response.data==null) {
    callback(null,true)
    } else {
    callback(response.data,true)
    }
    })
    .catch(function (error) {
    callback(null,false)
    })
    } export default {
    get,
    post,
    put,
    remove,
    }

21.Shiro在springboot与vue前后端分离项目里的session管理的更多相关文章

  1. Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案

    因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...

  2. 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  3. 两个开源的 Spring Boot + Vue 前后端分离项目

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  4. SpringBoot 和Vue前后端分离入门教程(附源码)

    作者:梁小生0101 juejin.im/post/5c622fb5e51d457f9f2c2381 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计 ...

  5. SpringBoot+Vue前后端分离项目,maven package自动打包整合

    起因:看过Dubbo管控台的都知道,人家是个前后端分离的项目,可是一条打包命令能让两个项目整合在一起,我早想这样玩玩了. 1. 建立个maven父项目 next 这个作为父工程,next Finish ...

  6. 【笔记】总结Springboot和Vue前后端分离的跨域问题

    跨域一直是个很玄学的问题,SSM的时候又得前后端一起配置,sb的时候又不用. 前端 axios普通get请求 submitForm() { var v=this; this.$axios({ meth ...

  7. 用vue前后端分离项目开发记录

    一:软件安装 1.1 检测node 是否安装 1.2 安装淘宝镜像 cnpm 1.3 安装vue-cli 1.4 检查是否安装vue-cli脚手架成功 1.5安装webpack 模块管理工具 二:创建 ...

  8. Django+Vue前后端分离项目的部署

    部署静态文件: 静态文件有两种方式 1:通过django路由访问 2:通过nginx直接访问 方式1: 需要在根目录的URL文件中增加 url(r'^$', TemplateView.as_view( ...

  9. 《Spring Boot 入门及前后端分离项目实践》系列介绍

    课程计划 课程地址点这里 本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 个部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 项目实践开发 ...

随机推荐

  1. 02.ArrayList和HashTable

    ArrayList集合 数组的缺点: (1).数组只能存储相同类型的数据. (2).数组的长度要在定义时确定. 集合的好处: (1).集合可以存储多种不同类型的数据. (2).集合的长度是可以任意改变 ...

  2. Python3.4 获取百度网页源码并保存在本地文件中

    最近学习python 版本 3.4 抓取网页源码并且保存在本地文件中 import urllib.request url='http://www.baidu.com' #上面的url一定要写明确,如果 ...

  3. CentOS-7 本地yum源挂载

    在Linux无法连接到互联网时,手动安装依赖是及其麻烦的一件事,需要花费大量的时间寻找rpm包.但在配置本地yum源后,绝决依赖问题就会变得非常简单. 一.准备 centos-7.ISO镜像文件: 二 ...

  4. 编程提取字符串"Java is a programming language"中的各个单词,并打印输出。

    import java.lang.String; import java.util.StringTokenizer; public class StringGetWord{ /* 编程提取字符串&qu ...

  5. 位运算(3)——Reverse Bits

    翻转32位无符号二进制整数 Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (r ...

  6. 10th week task -3 Arrow function restore

    Arrow function restore 为什么叫Arrow Function?因为它的定义用的就是一个箭头: x => x * x 上面的箭头函数相当于: function (x) { r ...

  7. Android之侧滑导航栏

    今天学习的新内容是侧滑导航栏,我想大家肯定都比较熟悉了,因为这个效果在qq里面也有,最近一直跟室友们玩的游戏是快速让自己的头像的点赞量上千.当然我的效果跟qq是没有办法比的,因为那里面的功能是在是太强 ...

  8. css样式学习小知识

    1. 使用百分比设置宽高 自适用宽高的,有分割的区域,可以适用百分比:30% 70% 如果有一部分是固定的宽度或者高度,可以使用:height: calc( 100% - 36px ); 2. inp ...

  9. 网络基础-IP、端口等

    首先来理解一下几个概念.      白帽子:有能力破坏电脑安全但不具恶意目的的黑客.白帽子一般有清楚的定义.道德规范并常常试图同企业合作去改善发现的安全弱点.         正义技术员. 灰帽子:对 ...

  10. 常见WEB开发安全漏洞 原因分析及解决

    目 录 1 会话标识未更新 3 1.1 原因 3 1.2 解决 3 2 SQL注入 3 2.1 原因 3 2.2 解决 5 3 XSS跨站脚本编制 5 3.1 原因 5 3.2 解决 5 4 XSRF ...