`
jinnianshilongnian
  • 浏览: 21504079 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2418686
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3008790
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5639490
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259916
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597323
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250220
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5858959
Group-logo
跟我学Nginx+Lua开...
浏览量:702008
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785224
社区版块
存档分类
最新评论

集成Shiro后当遇到404错误时会丢失session

阅读更多

场景:

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;

 

 

 

9
2
分享到:
评论
9 楼 dufangpu 2016-06-17  
我是继承了DefaultWebSessionManager,然后构造方法

super();
this.getSessionIdCookie().setName("JSESSIONID_SHIRO");

测试是可以的,cookie里面会增加JSESSIONID_SHIRO

不知道对不对,先这样搞吧,现在用还没问题。。。  
8 楼 shuai0420 2014-05-08  
请问大牛,怎么换session key?
7 楼 我心悠悠 2014-04-24  
jinnianshilongnian 写道
lyq881209 写道
forward到404页面时传递的request已经是shiro封装过的,获取的session是shiro的session,怎么是容器生成的session?

因为tomcat发现JSESSIONID对应的session它没有(是shiro管理的)
怎么解决这个问题?我现在系统已出错就到登陆页面去了。。。
6 楼 jinnianshilongnian 2014-03-14  
lyq881209 写道
forward到404页面时传递的request已经是shiro封装过的,获取的session是shiro的session,怎么是容器生成的session?

因为tomcat发现JSESSIONID对应的session它没有(是shiro管理的)
5 楼 lyq881209 2014-03-13  
forward到404页面时传递的request已经是shiro封装过的,获取的session是shiro的session,怎么是容器生成的session?
4 楼 jinnianshilongnian 2014-01-10  
ufohjl 写道
jinnianshilongnian 写道
ufohjl 写道
默认的好像是ServletContainerSessionManager

我使用这个 DefaultWebSessionManager 就会有这个问题的

嗯啊 确实是这样!
那岂不是在用DefaultWebSessionManager 的时候调用javax.servlet.http.HttpSession接口也不能正确获取到sesison,取而代之要用org.apache.shiro.session.Session?

最好不要依赖于HttpSession,而是自己实现一个
3 楼 ufohjl 2014-01-10  
jinnianshilongnian 写道
ufohjl 写道
默认的好像是ServletContainerSessionManager

我使用这个 DefaultWebSessionManager 就会有这个问题的

嗯啊 确实是这样!
那岂不是在用DefaultWebSessionManager 的时候调用javax.servlet.http.HttpSession接口也不能正确获取到sesison,取而代之要用org.apache.shiro.session.Session?
2 楼 jinnianshilongnian 2014-01-09  
ufohjl 写道
默认的好像是ServletContainerSessionManager

我使用这个 DefaultWebSessionManager 就会有这个问题的
1 楼 ufohjl 2014-01-09  
默认的好像是ServletContainerSessionManager

相关推荐

    shiro-redisson基于Redis的ShiroCache和Session实现

    在分布式环境下,传统的 Session 数据通常只能在一个特定的服务器上访问,导致用户在切换服务器时会话丢失。`shiro-redisson` 提供的基于 Redis 的会话管理,可以将会话数据存储在 Redis 中,实现会话在集群中的共享...

    Shiro集成 Redis 方案

    例如,当会话过期时,可以选择立即删除或者等待一段时间后再删除。 5. **配置缓存** 如果你需要使用 Redis 存储权限和角色相关的缓存,需要创建 `RedisCacheManager` 实例,并在 Shiro 配置中指定。 6. **连接池...

    springboot shiro redis缓存和session共享例子

    在实际运行中,当用户登录成功后,Shiro会创建session并存储在Redis中。后续请求可以通过sessionID从Redis中获取session数据,实现session共享。同时,通过Redis缓存可以提高常用数据的访问速度,减轻数据库压力。 ...

    单机版的shiro

    在 Shiro 中,Redis 可以作为会话管理的存储后端,替代默认的内存会话存储,避免会话在单机环境下丢失。配置 Shiro 使用 Redis 存储会话,需要设置 `sessionManager` 和 `sessionDAO`,并使用对应的 RedisSessionDAO...

    shiro上课代码.zip

    - **Web应用**:Shiro可以很好地集成到Spring MVC或Servlet容器中,实现登录、权限控制等功能。 - **命令行应用**:即使没有Web环境,Shiro也可以用于控制命令行程序的访问权限。 - **桌面应用**:对于Java Swing...

    shiro-demo不自定义缓存.zip

    如果不自定义缓存,Shiro 默认会将会话信息存储在服务器内存中,这在多服务器环境可能会导致会话丢失。为了跨服务器共享会话,一般会使用分布式缓存(如 Redis 或 Memcached)来存储会话。 4. **缓存**(Caching)...

    shiro建表sql-mysql.zip

    例如,当用户尝试访问某个资源时,Shiro会检查该用户是否拥有相应的角色,以及该角色是否包含了允许访问该资源的权限。 在`shiro建表.sql`文件中,你将找到创建这些表的SQL语句,适用于MySQL 5.5版本。请确保根据你...

    Springboot + shiro权限管理

    Shiro 提供了会话管理功能,可以处理会话超时、会话状态丢失等问题。开发者可以自定义 SessionManager 和 SessionDAO 实现 session 数据的持久化。 **6. 安全最佳实践** - **密码加密**:用户密码在存储时应进行...

    shiro-se例子代码

    在`shiro-se`中,可能会有一个`sessionDAO`来持久化会话,防止会话丢失。 4. **加密(Cryptography)** Shiro提供了丰富的加密工具,如MD5、SHA等,用于密码存储和数据保护。`CredentialsMatcher`是用于比较原始...

    redis-tomcat67 session共享资源包

    当用户登录或进行其他需要记录状态的操作时,服务器会创建一个Session对象,将相关信息存储在其中,并通过Session ID跟踪用户的状态。在单个服务器环境中,Session管理相对简单,但在多台服务器的集群环境中,由于每...

    sbshiro.zip

    3. 会话管理:如果遇到会话丢失或不一致的问题,可能需要检查Shiro的session配置,如session超时时间、session存储方式等。 总结,SpringBoot与Shiro的整合为开发者提供了便捷的安全管理手段,通过上述步骤和实战...

    spring-shiro-redis-example

    通过这个示例项目,开发者可以学习到如何在Spring环境中集成Shiro和Redis,理解它们之间的交互方式,以及如何利用这些工具来构建安全、高性能的Web应用。同时,这也是一个很好的实践机会,帮助开发者提升在企业级...

    OBA开发系列课程(9):OBA项目部署

    在Tomcat中,当检测到新WAR文件时,会自动解压并启动应用。 5. **数据库初始化**:如果OBA应用依赖于数据库,需在部署前或部署后执行SQL脚本,创建必要的表结构和初始化数据。 6. **权限与安全**:OBA项目可能包含...

    权限管理模块+购物车

    此外,购物车数据的持久化也非常重要,防止用户关闭浏览器后丢失信息,这可以通过将购物车内容存储在数据库或使用Cookie来实现。 结合这两个组件,我们可以创建一个综合的Web应用,让用户在具有权限控制的环境中...

    Java Web项目开发案例精粹03-在线考试系统

    这通常通过session管理和cookie来实现,也可能用到Spring Security或Apache Shiro等安全框架。 5. **JDBC连接管理**:与数据库交互通常使用Java Database Connectivity(JDBC)。开发者需要知道如何配置数据库连接...

    网上考试系统

    例如,使用Spring Security或Apache Shiro进行用户登录验证,防止未授权访问。 4. **会话管理**:确保用户在考试期间的会话安全,防止作弊。通过Cookie和Session控制用户状态,限制多设备登录,实现单用户单会话。 ...

Global site tag (gtag.js) - Google Analytics