摘要:實現(xiàn)分布式集群的共享共享本文使用實現(xiàn)共享,基于實現(xiàn)想使用基于容器的共享請搜索其他文章本文不講解基礎環(huán)境搭建,需要使用等相關知識點,不做介紹未做共享整體項目結(jié)構基礎代碼未做共
title: spring-session實現(xiàn)分布式集群session的共享
tags: springboot,spring,session共享
**本文使用springboot實現(xiàn)session共享,基于spring session實現(xiàn)
想使用基于容器的session共享請搜索其他文章
本文不講解基礎環(huán)境搭建,需要使用idea、maven、springboot等相關知識點,不做介紹
未做session共享 整體項目結(jié)構 基礎代碼: 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共享之前的結(jié)果 session共享 項目結(jié)構Spring MVC + Thymeleaf Example Hello,
ContextPath, !
Hello, !
session, !
整體項目結(jié)構與原來保持一致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{ }
其他不用變
最終結(jié)果代碼地址:
https://gitee.com/soft_xiang/...
---------------2018.06.20 更新-----------------------------------------------
使用spring session之后原h(huán)ttpsessionListener的創(chuàng)建和銷毀session的監(jiān)聽器會失效
處理方法: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實現(xiàn)方式,但講的較好,推薦
https://www.cnblogs.com/youzh...springboot方式,有一些踩坑記錄
https://blog.csdn.net/dream_b...
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72056.html
摘要:問題正如上描述,事件有時監(jiān)聽會丟失,不支持集群這種場景。只有訂閱和創(chuàng)建連接同時連接到一臺節(jié)點才能監(jiān)聽到這個產(chǎn)生的事件。解決方案自己對所有集群主備節(jié)點進行事件訂閱。 問題:正如github上issue描述,expired事件有時監(jiān)聽會丟失,spring-session不支持redis集群這種場景。https://github.com/spring-pro... 原因:spring-ses...
摘要:而調(diào)用后端服務就應用了的高級特分布式配置管理平臺后端掘金輕量的分布式配置管理平臺。關于網(wǎng)絡深度解讀后端掘金什么是網(wǎng)絡呢總的來說,網(wǎng)絡中的容器們可以相互通信,網(wǎng)絡外的又訪問不了這些容器。 在 Java 路上,我看過的一些書、源碼和框架(持續(xù)更新) - 后端 - 掘金簡書 占小狼轉(zhuǎn)載請注明原創(chuàng)出處,謝謝!如果讀完覺得有收獲的話,歡迎點贊加關注 物有本末,事有終始,知所先后,則近道矣 ......
摘要:盡可能地將數(shù)據(jù)寫入,例如創(chuàng)建設置的都會將數(shù)據(jù)立即的寫入再來看看文檔怎么描述的看看這可愛的默認值我們終于知道了當我們不做任何設置時,默認采用的是方式顯而易見,使用方式能最大限度的減少與的交互,而在大多數(shù)場景下都是沒有問題的。 0.問題背景 此次問題源于一次挺嚴重的生產(chǎn)事故:客戶的訂單被重復生成了,而出問題的代碼其實很簡單: // .... redisLockUtil.lock(membe...
閱讀 1398·2021-10-11 10:58
閱讀 1482·2021-09-04 16:41
閱讀 679·2019-08-30 15:55
閱讀 804·2019-08-29 18:46
閱讀 3145·2019-08-29 14:05
閱讀 3531·2019-08-26 14:00
閱讀 2455·2019-08-26 13:53
閱讀 3179·2019-08-26 13:29