场景:
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;
相关推荐
在分布式环境下,传统的 Session 数据通常只能在一个特定的服务器上访问,导致用户在切换服务器时会话丢失。`shiro-redisson` 提供的基于 Redis 的会话管理,可以将会话数据存储在 Redis 中,实现会话在集群中的共享...
例如,当会话过期时,可以选择立即删除或者等待一段时间后再删除。 5. **配置缓存** 如果你需要使用 Redis 存储权限和角色相关的缓存,需要创建 `RedisCacheManager` 实例,并在 Shiro 配置中指定。 6. **连接池...
在实际运行中,当用户登录成功后,Shiro会创建session并存储在Redis中。后续请求可以通过sessionID从Redis中获取session数据,实现session共享。同时,通过Redis缓存可以提高常用数据的访问速度,减轻数据库压力。 ...
在 Shiro 中,Redis 可以作为会话管理的存储后端,替代默认的内存会话存储,避免会话在单机环境下丢失。配置 Shiro 使用 Redis 存储会话,需要设置 `sessionManager` 和 `sessionDAO`,并使用对应的 RedisSessionDAO...
- **Web应用**:Shiro可以很好地集成到Spring MVC或Servlet容器中,实现登录、权限控制等功能。 - **命令行应用**:即使没有Web环境,Shiro也可以用于控制命令行程序的访问权限。 - **桌面应用**:对于Java Swing...
如果不自定义缓存,Shiro 默认会将会话信息存储在服务器内存中,这在多服务器环境可能会导致会话丢失。为了跨服务器共享会话,一般会使用分布式缓存(如 Redis 或 Memcached)来存储会话。 4. **缓存**(Caching)...
例如,当用户尝试访问某个资源时,Shiro会检查该用户是否拥有相应的角色,以及该角色是否包含了允许访问该资源的权限。 在`shiro建表.sql`文件中,你将找到创建这些表的SQL语句,适用于MySQL 5.5版本。请确保根据你...
Shiro 提供了会话管理功能,可以处理会话超时、会话状态丢失等问题。开发者可以自定义 SessionManager 和 SessionDAO 实现 session 数据的持久化。 **6. 安全最佳实践** - **密码加密**:用户密码在存储时应进行...
在`shiro-se`中,可能会有一个`sessionDAO`来持久化会话,防止会话丢失。 4. **加密(Cryptography)** Shiro提供了丰富的加密工具,如MD5、SHA等,用于密码存储和数据保护。`CredentialsMatcher`是用于比较原始...
当用户登录或进行其他需要记录状态的操作时,服务器会创建一个Session对象,将相关信息存储在其中,并通过Session ID跟踪用户的状态。在单个服务器环境中,Session管理相对简单,但在多台服务器的集群环境中,由于每...
3. 会话管理:如果遇到会话丢失或不一致的问题,可能需要检查Shiro的session配置,如session超时时间、session存储方式等。 总结,SpringBoot与Shiro的整合为开发者提供了便捷的安全管理手段,通过上述步骤和实战...
通过这个示例项目,开发者可以学习到如何在Spring环境中集成Shiro和Redis,理解它们之间的交互方式,以及如何利用这些工具来构建安全、高性能的Web应用。同时,这也是一个很好的实践机会,帮助开发者提升在企业级...
在Tomcat中,当检测到新WAR文件时,会自动解压并启动应用。 5. **数据库初始化**:如果OBA应用依赖于数据库,需在部署前或部署后执行SQL脚本,创建必要的表结构和初始化数据。 6. **权限与安全**:OBA项目可能包含...
此外,购物车数据的持久化也非常重要,防止用户关闭浏览器后丢失信息,这可以通过将购物车内容存储在数据库或使用Cookie来实现。 结合这两个组件,我们可以创建一个综合的Web应用,让用户在具有权限控制的环境中...
这通常通过session管理和cookie来实现,也可能用到Spring Security或Apache Shiro等安全框架。 5. **JDBC连接管理**:与数据库交互通常使用Java Database Connectivity(JDBC)。开发者需要知道如何配置数据库连接...
例如,使用Spring Security或Apache Shiro进行用户登录验证,防止未授权访问。 4. **会话管理**:确保用户在考试期间的会话安全,防止作弊。通过Cookie和Session控制用户状态,限制多设备登录,实现单用户单会话。 ...