session springboot 會話共享實現
阿新 • • 發佈:2018-12-31
寫在前面:
這個一個本人實現的 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 對我們來說不需要共享)