写在前面:
这个一个本人实现的 session 共享方案,使用Java 实现,在应用层解决session 多机器部署不一致问题。大家有好的建议可以评论我,谢过!
springboot + redis 实现 tomcat 在应用层解决session 会话共享。
gitee 地址:https://gitee.com/immer/session-java.git
一、 环境配置
jdk 1.8 、springboot 、 tomcat 、 redis
二、 配置部署 session
1. 加入github的9个类至自己项目的src 源码目录
2. 配置如下filter
/** * session 管理器,使用redis 管理 */ @Bean public RedisSessionManger redisSessionClient(RedisTemplate redisTemplate){ return new RedisSessionManger(new RedisSessionClient(redisTemplate)); } /** * filter 重新包装 HttpServeltRequestWraper */ @Bean public FilterRegistrationBean testFilterRegistration(RedisSessionManger redisSessionManger) { FilterRegistrationBean registration = new FilterRegistrationBean(new SessionClusterFilter(redisSessionManger)); registration.addUrlPatterns("/*"); registration.addInitParameter("paramName", "paramValue"); registration.setName("sessionFilter"); return registration; }
三、使用demo(使用方式不变动,springmvc 注入即可)
@RequestMapping("/hello") public String helloWorld(HttpServletRequest request) { HttpSession session = request.getSession(); session.setAttribute("wei",123); Enumeration<String> enumeration = session.getAttributeNames(); while (enumeration.hasMoreElements()){ String attrName= enumeration.nextElement(); System.out.println("attrName:" + attrName +"attrValue:" + session.getAttribute(attrName)); } return "Hello Spring-session"; }
四、实现原理:
使用 servlet filter 机制重新包装request , 重新实现session,最后使用redis存储session。
五、和springSession 的实现异同
1. 此部分实现类似spring-sesssion ,但去除了spring-session 中websocket 等session,代码量更少。
2. 存储方式简单,session 属性修改即时刷线redis (spring-session 采用缓存异步的方式)
六、好处
有很多的方案可以实现session 共享刚,比如 ip hash; tomcat session 共享,这写方案都会影响上层多做任务,耦合性比较大。(如果某一天两个不同的项目部署在同一个tomcat 下,那么session 对我们来说不需要共享)