shiro 使用redis 频繁请求获取session的问题

17 篇文章 0 订阅

shiro 框架获取 session里面的属性时,每次都去拿取session,一次请求中会有很多次 获取 session 里面的属性,所以有很多次,这个如果是本地缓存到无所谓,因为本地缓存是直接放置session对象的,但是如果是共享缓存比如 redis ,这个就郁闷了,每次获取session都要从redis 里面获取然后反序列化。操作session属性导致频繁访问redis这个大概是没办法避免了.shiro对每一次请求都会更新最后访问时间.当一个页面包含多个资源的时候就会发生多次update session。

方案1:
重写sessiondao的方法,当发现是静态资源时,放弃update

重写sessionDAO方法,里面获取当前的request,判断当前访问的是否是静态资源,如果是静态资源则不更新。
获取当前request的方法:
1、在web.xml添加如下listener
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>


@Override
 protected void doUpdate(Session session) {
 /**
 * 每次请求shiro都会更新最后访问时间,导致调用此方法,由于使用了redis缓存,
 * 那么如果静态资源很多会导致短时间内大量更新redis缓存
 * 但是这是不需要的,只有在访问controller请求时才需要更新session
 */
 HttpServletRequest request = Servlets.getRequest();
 if (request != null){
     String uri = request.getServletPath();
     // 如果是静态文件,则不更新SESSION
     if (Servlets.isStaticFile(uri)){
         return;
     }
     // 如果是视图文件,则不更新SESSION
     if (StringUtils.startsWith(uri, PropertiesUtil.getString("web.view.prefix"))
         && StringUtils.endsWith(uri, PropertiesUtil.getString("web.view.suffix"))){
     return;}  
	... 
}

@Override
	protected Session doReadSession(Serializable sessionId) {

		Session s = null;
		HttpServletRequest request = Servlets.getRequest();
		if (request != null){
			String uri = request.getServletPath();
			// 如果是静态文件,则不获取SESSION
			if (Servlets.isStaticFile(uri)){
				return null;
			}
			s = (Session)request.getAttribute("session_"+sessionId);
		}
		if (s != null){
			return s;
		}
		//去redis读取session
}		


springmvc中判断当前访问是否静态资源 http://blog.csdn.net/zsg88/article/details/77018543

方案2:
将SpringMVC和Shiro的url-pattern由"/"修改为"*.do",在容器层过滤掉静态请求.



  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值