收藏私塾在线
 

欢迎您来到私塾在线网!   

请登录! 

免费注册 

交流首页 » Java »集成Shiro后当遇到404错误时会丢失session  XML
发表人 内容
zhang
[头像]

交流经验:
总积分:261656
级别:VIP5
注册时间: 2011-08-09
文章: 1163
离线

场景:

1、首先登录成功后访问正常页面没有问题的;

2、接着访问一个不存在的页面,即跳到相应的404页面,假设我的页面是jsp的;

3、再刷新一下就会又跳到登录页面。

 

场景分析:

1、首先登录成功,假设JSESSIONID=e688f231-c0f0-4757-b85b-9ff1e62221b3;

2、接着访问一个不存在的页面,提交的JSESSIONID=e688f231-c0f0-4757-b85b-9ff1e62221b3;即提交的JSESSIONID和登录成功的一样;没什么问题;

3、接着随便访问一个地址,会得到JSESSIONID=19eqzaptfpxad17y06dz3uc6xz;两次JSESSIONID不一样且格式不类似,【1、2】步骤的明显是Java UUID生成的key;而第二个则像是如Jetty容器生成的;

4、为什么呢?

 

技术分析:

1、首先如果登录成功,Shiro的DefaultWebSessionManager会默认通过如下方式添加JSESSIONID Cookie到响应:

    private void storeSessionId(Serializable currentId, HttpServletRequest request, HttpServletResponse response) {
        if (currentId == null) {
            String msg = "sessionId cannot be null when persisting for subsequent requests.";
            throw new IllegalArgumentException(msg);
        }
        Cookie template = getSessionIdCookie(); //此处得到JSESSIONID的一个cookie模板
        Cookie cookie = new SimpleCookie(template);
        String idString = currentId.toString();
        cookie.setValue(idString);
        cookie.saveTo(request, response);
        log.trace("Set session ID cookie for session with id {}", idString);
    }

 

2、如果客户端访问时会带着个Cookie回来;但是注意:容器不认识的(Web容器并没有真正创建HttpSession);Shiro默认情况下会生成自己的一套Session,默认是MemorySessionDAO;即放到内存中的;和Web容器没有任何关系;

 

3、 接着访问一个错误的页面(如jsp);此时到了Shiro过滤器,过滤器通过;然后最后forward到这个错误页面;大家应该知道默认情况下jsp页面是需要session的;所以此时jsp会调用request.getSession() 此时创建了一个Session;这会往Cookie写JSESSIONID的;

 

如何解决呢?

1、换一个新的session key,如uid; 推荐这种做法;

2、错误页面 设置<%@ page session="false' %>;

3、给shiro filter配置<dispatcher>ERROR</dispatcher>,然后在其filterChainDefinitions中添加/WEB-INF/jsp/error/error = anon;

 

 

 


推广链接
精品视频课程推荐

Java数据结构和算法精讲版
本课程专注于数据结构和算法的内容,使用Java来进行代码示例,不空洞的讲解概念和理论,重点放在代码的实现和示例上。 从零开始、全面系统、成体系的讲解数据结构和基本算法,循序渐进的讲述构建软件系统所常见的数据结构和算法。

深入浅出学Shrio视频教程
内容概述:Shiro是目前最热门、最易用、功能超强大的Java权限管理框架,强烈推荐,每个项目都必备的权限管理技术!通过本课程,你将从零开始直到彻底掌握Shiro的相关开发知识,达到可以进行实际项目开发的能力。包括:权限管理基础、Shiro入门、配置、身份认证、授权、Realms、Session管理、和Spring的集成、Web、Cache等众多开发细节技术 技术要点:源码级分析Shiro的授权过程、自定义开发Realm、多个Realms的开发配置、自定义开发AuthenticationStrategy、自定义开发自定义SessionDAO、和Struts2+Spring3的集成(包括修正struts2的bug)、Shiro和SpringMVC+Spring3的集成、包装使用其他的Cache框架、缓存数据同步更新的解决方案等等实际开发中常用的内容

XML基础视频教程
创建规范的XML文档,DTD的作用,并且可以根据要求创建私用的DTD,通过JavaScript解析XML DOM

Weblogic实战视频教程
WebLogic基础知识:WebLogic基本概念、正确安装WebLogic、建域、应用部署于JDBC选择、对WebLogic的监控和日志查看、集群的高可用性;课程目标:彻底掌握WebLogic的基本概念,在理解基本概念的基础上做到正确的安装WebLogic,根据不同的需求创建域,合理选择应用部署和JDBC配置。熟练掌握WebLogic的console监控,了解各种性能和运行指标,以及对监控结果的分析,运用集群的高可用性,对集群架设。

最新jbpm4工作流开发实战视频教程
从零到精通jBPM的开发知识;理解工作流的理论、掌握自行开发工作流的思路、系统学习使用jBPM来实现工作流应用、掌握jBPM和Web项目的结合、掌握一些实际开发中典型的业务实现(会签、委托等)

sbwfgihc
[头像]

交流经验:
总积分:100
级别:普通会员
注册时间: 2015-12-24
文章: 1
离线

换一个新的session key,如uid; 推荐这种做法;,具体是怎样做的呢~~

 
交流首页 » Java
前往:   

关于我们 | 联系我们 | 用户协议 | 私塾在线服务协议 | 版权声明 | 隐私保护

版权所有 Copyright(C)2009-2012 私塾在线学习网