前后端分离项目sessionId怎么传递给shiro

8 篇文章 0 订阅
2 篇文章 0 订阅

==建议使用 jwt ==

前端

对后端访问时在ajax请求头添加一条【Authorization:sessionId】
下面示例(vuejs项目中基于axios):
mian.js:

import Vue from 'vue'
import App from './App'
import router from './router'
import axios from 'axios'
import doCookie from '@/base/crudCookie'//自己写的cookie操作类

// 配置axios  --推荐改为单独配置文件(-添加加拦截器-)
// var axios = require('axios') 功能大体与import相似,推荐使用import。
axios.defaults.timeout = 5000 //请求超时 5秒
axios.defaults.headers.post['Content-Type'] = 'application/json';
/**
 * 添加请求头:【Authorization:sessionId】
 * 此处的Authorization需要与后端相同
 */
axios.defaults.headers.common['Authorization'] = doCookie.getCookie("SESSIONID")
axios.defaults.baseURL = 'http://localhost:8888/yao' //后端项目地址

crudCookie.js本类是对cookie的操作:

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
	}
	
}

后端

在此需要对SessionManager 进行重写

/**
* @version:     1.0
* @since:       JDK 1.8.0_91
* @Description: 适用于前后端分离情况下对sessionId的获取
*
* <br>Modification History:<br>

* Date       |      Author      |      Version    |       Description<br>
* ------------------------------------------------------------------<br>

* 2018年10月23日   |     yao_x_x      |         1.0        |         1.0 Version
 
*/

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);
	}

}

shiro配置类:将上文中重写过的CustomSessionManager配置进SecurityManager中

@Bean("securityManager")
	public SecurityManager securityManager(@Qualifier("authRealm")AuthRealm authRealm
			,@Qualifier("sessionManager")SessionManager sessionManager) {
		DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
		manager.setRealm(authRealm);
		manager.setSessionManager(sessionManager);
		return manager;
	}


@Bean("sessionManager")
	public SessionManager sessionManager(){
		CustomSessionManager manager = new CustomSessionManager();
		/*使用了shiro自带缓存,
		如果设置 redis为缓存需要重写CacheManager(其中需要重写Cache)
		manager.setCacheManager(this.RedisCacheManager());*/
		
        manager.setSessionDAO(new EnterpriseCacheSessionDAO());
		return manager;
	}
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值