一.流程概述
主要是通过扩展ServletRequestWraper来实现的。
1.SessionRepositoryFilter.doFilterInternal
2.会创建SessionRepositoryRequestWrapper,这里面的getSession(boolean)会从外部存储创建session
---sessionRepository是RedisOperationsSessionRepository
---new redissession的时候会设置一些默认属性,比如间隔时间,lastAccessTime等
这些属性关联保存在MapSession中,创建完session会设置lastAccessTime
---过滤器链执行完后,有commitSession,会把session存储到外部存储,比如redis
- try {
- filterChain.doFilter(strategyRequest, strategyResponse);
- }
- finally {
- wrappedRequest.commitSession();//这里实际会到RedisSession的saveDelta方法
- }
这种方式即使我们在session里面放了一个list,然后往list里面添加元素,且未显示更新session的时候,session的过期时间依然会更新。如下。
- List<String> list = (List<String>) session.getAttribute("list");
- if (list == null) {
- list = new ArrayList<>();
- session.setAttribute("list", list);
- }
- list.add(new Date().toString()); //2
在2的时候session的时间会被更新
---当后续访问到来时,会通过sessionId获取session,同时更新lastAccessTime。
3.这个filter是在SpringHttpSessionConfiguration里面创建的,当然redis的实现也有对应的实现,RedisHttpSessionConfiguration,是上面class的子类
---如果想配置session的过期时间,那么需要在RedisHttpSessionConfiguration里面配置,有个参数maxInactiveIntervalInSeconds,默认1800秒。因为session的管理被放到了外部的存储,所以web.xml里面的关于session过期的配置不在生效。
简单配置
- <context:annotation-config />
- <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" >
- <!-- 5分钟过期 -->
- <property name="maxInactiveIntervalInSeconds" value="300" />
- </bean>
- <bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" />
二.sessionListener support
1.在RedisOperationSessionRepository实现了MessageListener接口,redis有消息通知的时候,onMessage方法被调用,然后接下来把消息封装成各种事件
然后通过ApplicationEventPublisher和listener协作(观察者模式),
前者发送事件,后者监听处理。
2.SessionEventHttpSessionListenerAdapter实现了ApplicationListener,有新事件时,onApplicationEvent方法被调用。所以只需要在这个类里面添加我们所需要的处理逻辑的listener即可。
- public SessionEventHttpSessionListenerAdapter(List<HttpSessionListener> listeners){
- super();
- this.listeners = listeners;
- }
注:假如我们启动2个tomcat,那么当一个session过期时,那么我们的listener在这2个tomcat都会收到事件通知。会导致重复。如果需要基于session listener做一些事情,则需要注意这点。
- <bean id="listenerAdapter" class="org.springframework.session.web.http.SessionEventHttpSessionListenerAdapter">
- <constructor-arg name="listeners">
- <list>
- <bean class="com.lp.techDemo.session.SessionListenerDemo" />
- </list>
- </constructor-arg>
- </bean>
Reference:
http://www.infoq.com/cn/articles/Next-Generation-Session-Management-with-Spring-Session?utm_campaign=rightbar_v2&utm_source=infoq&utm_medium=articles_link&utm_content=link_text
http://blog.csdn.net/shuipinglp/article/details/51578930
相关推荐
Spring Security可以通过配置`<session-config>`元素或使用`HttpSessionEventPublisher`监听器来设置会话超时时间。 4. **会话并发控制** - 会话并发控制限制了同一用户在同一时间可以活跃的会话数量,防止会话...
例如,session是如何在HTTP协议中实现的、session过期后如何清除、如何在不同容器中管理session等,这些内容对于理解和实现session监听机制也是十分关键的。总之,通过SpringMVC拦截器来实现对session是否过期的监听...
首先,session监听是实现session控制的一种常见方法,通过实现特定的监听器接口,可以在session创建、销毁或者超时等事件发生时得到通知。在Spring MVC中,虽然不能直接使用Java EE标准的HttpSessionListener,但...
3. **session监听**:使用`HttpSessionListener`或`HttpSessionAttributeListener`接口,监听session的创建和销毁事件。在session创建时,`onlineCount`加1;在session销毁(可能是用户主动退出或超时)时,`...
一是设置Session监听器,监听Session的销毁事件;二是每次接收到请求时,检查Session的有效性,如果过期则进行处理。 3. **Session过期后的处理**:常见的处理方式包括: - 弹出登录框:当检测到Session过期,...
这就需要我们在Session监听器中实现逻辑,当Session失效时触发事件并更新计数。 3. **分布式环境**:在分布式系统中,多个服务器可能共享同一个Session存储(例如使用Redis或Memcached)。在这种情况下,Session...
- **监听器**:在`Tomcat`中添加`SessionListener`,以便在`session`创建、销毁时通知`Redis`,保持两者同步。 - **冲突解决**:在分布式环境下,可能有多个服务器同时尝试更新同一`session`,需要确保`Redis`的...
二维码显示成功后,使用SSE方式开启二维码session监听状态,状态:0 二维码生成成功 ,1 手机端扫码成功 2手机端确认登录 -1 sessionId过期失效 调用登录接口,跳转到扫描二维码界面 扫描二维码,发送扫描通知 ...
在单点登录场景下,`SessionListener`通常用来监听用户登录事件,当用户在一个系统中登录后,我们可以通过`SessionListener`来创建或更新全局的会话信息,确保其他系统能够识别这个登录状态。 ### 持久化Session 在...
总结来说,处理Ajax请求中的用户session失效问题,需要在后端识别Ajax请求并返回特定的响应头,然后在前端监听并处理这些响应,以便在session过期时提示用户重新登录。通过这种方式,我们可以确保无论用户如何与页面...
12.2.2. 在Spring的application context中创建 SessionFactory 12.2.3. HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. ...
用来控制一个浏览器只能登陆一个用户,用户退出时清空cookie,关闭浏览器cookie自动清空,用户非正常退出下,需等待20分的session失效时间后方可正常登陆,监听session的失效方法在session失效时清空对应的sessionID...
用来控制一个浏览器只能登陆一个用户,用户退出时清空cookie,关闭浏览器cookie自动清空,用户非正常退出下,需等待20分的session失效时间后方可正常登陆,监听session的失效方法在session失效时清空对应的sessionID...
如果找到了,那么将该session失效,并从存储中移除。然后将新的登录信息存入session,并更新存储结构。 #### 5. 配置web.xml 在`web.xml`中配置监听器,当用户登录成功后,登录方法需要设置登录成功的信息到session...
- 另外,为了在每个HTTP请求处理完后关闭Session,可以在`web.xml`中配置`OpenSessionInViewFilter`,避免Session失效问题。 6. **事务管理**: - 配置Spring的事务管理器,例如`HibernateTransactionManager`,...
- **Filter和Listener**:在Java Web中的作用,如登录验证过滤器和Session监听器。 ### 第23章:Spring MVC框架 - **Spring MVC介绍**:Spring框架的MVC模块,提供轻量级的Web开发解决方案。 - **Spring MVC组件**...
例如,以下配置创建了一个监听Session创建和销毁的监听器: ```xml <listener-class>com.example.SessionListener</listener-class> ``` `SessionListener`类需要实现`javax.servlet....
当用户禁用Cookie时,服务器端无法通过Cookie来识别特定用户,这将导致基于Cookie的Session失效。为解决此问题,可以使用URL重写技术,在每个发送给用户的URL后面附加一个唯一的Session ID,以此来跟踪用户。例如,...
默认情况下,ActiveMQ会监听61616端口进行TCP连接,且管理界面可在8161端口的http://localhost:8161/admin访问。 三、创建与消费消息 1. 生产者:使用JMS API,我们可以创建一个MessageProducer对象来发送消息。...