摘要:實現分布式集群的共享共享本文使用實現共享,基于實現想使用基于容器的共享請搜索其他文章本文不講解基礎環境搭建,需要使用等相關知識點,不做介紹未做共享整體項目結構基礎代碼未做共
title: spring-session實現分布式集群session的共享
tags: springboot,spring,session共享
**本文使用springboot實現session共享,基于spring session實現
想使用基于容器的session共享請搜索其他文章
本文不講解基礎環境搭建,需要使用idea、maven、springboot等相關知識點,不做介紹
未做session共享 整體項目結構 基礎代碼: pom.xmlSpringbootDemoApplication.java4.0.0 com.xiang.springboot.demo springboot-demo 0.0.1-SNAPSHOT jar springboot-demo Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 2.0.2.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
package com.xiang.springboot.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.context.ServletContextAware; import javax.servlet.ServletContext; @SpringBootApplication public class SpringbootDemoApplication implements ServletContextAware { public static void main(String[] args) { SpringApplication.run(SpringbootDemoApplication.class, args); } @Override public void setServletContext(ServletContext context) { String ctx = context.getContextPath(); System.out.println("ctx=" + ctx); context.setAttribute("ctx", ctx); } }TestController.java
package com.xiang.springboot.demo.module1.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @Controller @RequestMapping("/module1") public class TestController { @GetMapping("/page1") public String page1(HttpServletRequest request, HttpServletResponse response, RedirectAttributes attr, ModelMap map) { System.out.println(attr.getFlashAttributes().get("test")); System.out.println("aaaaaaaaaaaaaa" + map.get("test")); HttpSession session = request.getSession(); session.setAttribute("sessiontest","session test text...."+session.getId()); String url = request.getScheme()+":111//"+request.getServerName()+":"+request.getServerPort()+"-"+request.getLocalPort()+"/"+request.getContextPath()+"/"+request.getRequestURI(); session.setAttribute("ctpath",url); return "module1/page1"; } @GetMapping("/page2") public String page2(HttpServletRequest request, HttpServletResponse response, RedirectAttributes attr) { attr.addFlashAttribute("test", "testaaaaa"); return "redirect:/module1/page1"; } }page1.html
未做session共享之前的結果 session共享 項目結構Spring MVC + Thymeleaf Example Hello,
ContextPath, !
Hello, !
session, !
整體項目結構與原來保持一致pom.xml
原pom.xml中加入
application.ymlorg.springframework.boot spring-boot-starter-redis 1.3.8.RELEASE org.springframework.session spring-session-data-redis
將原來的application.properties改名了
加入:
spring: redis: database: 0 host: *** port: 6379 password: *** timeout: 0 pool: max-active: 8 max-wait: -1 max-idle: 8 min-idle: 0 session: store-type: none
加入新文件RedisHttpSessionConfig.java
package com.xiang.springboot.demo.module1.config; import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @Configuration //maxInactiveIntervalInSeconds 默認是1800秒過期,這里測試修改為60秒 @EnableRedisHttpSession(maxInactiveIntervalInSeconds=60) public class RedisHttpSessionConfig{ }
其他不用變
最終結果代碼地址:
https://gitee.com/soft_xiang/...
---------------2018.06.20 更新-----------------------------------------------
使用spring session之后原httpsessionListener的創建和銷毀session的監聽器會失效
處理方法:https://docs.spring.io/spring...
代碼如下:
@Configuration //maxInactiveIntervalInSeconds 默認是1800秒過期,這里測試修改為60秒 @EnableRedisHttpSession(maxInactiveIntervalInSeconds=180) public class RedisHttpSessionConfig{ @Bean public SessionEventHttpSessionListenerAdapter getSessionEventHttpSessionListenerAdapter(){ Listlisteners = new ArrayList<>(); listeners.add(getHttpSessionListener()); return new SessionEventHttpSessionListenerAdapter(listeners); } @Bean public HttpSessionListener getHttpSessionListener(){ return new MyHttpSessionListener(); } }
---------------2018.06.20 更新end-----------------------------------------------
參考:
不是springboot實現方式,但講的較好,推薦
https://www.cnblogs.com/youzh...springboot方式,有一些踩坑記錄
https://blog.csdn.net/dream_b...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72056.html
摘要:問題正如上描述,事件有時監聽會丟失,不支持集群這種場景。只有訂閱和創建連接同時連接到一臺節點才能監聽到這個產生的事件。解決方案自己對所有集群主備節點進行事件訂閱。 問題:正如github上issue描述,expired事件有時監聽會丟失,spring-session不支持redis集群這種場景。https://github.com/spring-pro... 原因:spring-ses...
摘要:而調用后端服務就應用了的高級特分布式配置管理平臺后端掘金輕量的分布式配置管理平臺。關于網絡深度解讀后端掘金什么是網絡呢總的來說,網絡中的容器們可以相互通信,網絡外的又訪問不了這些容器。 在 Java 路上,我看過的一些書、源碼和框架(持續更新) - 后端 - 掘金簡書 占小狼轉載請注明原創出處,謝謝!如果讀完覺得有收獲的話,歡迎點贊加關注 物有本末,事有終始,知所先后,則近道矣 ......
摘要:盡可能地將數據寫入,例如創建設置的都會將數據立即的寫入再來看看文檔怎么描述的看看這可愛的默認值我們終于知道了當我們不做任何設置時,默認采用的是方式顯而易見,使用方式能最大限度的減少與的交互,而在大多數場景下都是沒有問題的。 0.問題背景 此次問題源于一次挺嚴重的生產事故:客戶的訂單被重復生成了,而出問題的代碼其實很簡單: // .... redisLockUtil.lock(membe...
閱讀 1389·2021-10-11 10:58
閱讀 1471·2021-09-04 16:41
閱讀 670·2019-08-30 15:55
閱讀 799·2019-08-29 18:46
閱讀 3133·2019-08-29 14:05
閱讀 3525·2019-08-26 14:00
閱讀 2448·2019-08-26 13:53
閱讀 3164·2019-08-26 13:29