|
| 1 | +### Spring Boot Session共享 ### |
| 2 | +分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多;还有一种是利用一些tomcat上的插件,修改tomcat配置文件,让tomcat自己去把Session放到Redis/Memcached/DB中去。这两种各有优缺,也都能解决问题 |
| 3 | + |
| 4 | +但是现在项目全线Spring Boot,并不自己维护Tomcat,而是由Spring去启动Tomcat。这样就会有一个问题:在服务器上并不存在一个持久存在的Tomcat程序,这样也无从去修改Tomcat的配置文件了。经过了一番搜索,发现Spring果然对这个问题有自己的解决方案,那就是Spring-Session |
| 5 | + |
| 6 | +Spring-Session是通过过滤器实现的session共享,具体原理可以自己去官网查,这里只说一下如何配置。整个项目基于Spring Boot,如果不是Boot项目就需要自己去调整了。 |
| 7 | + |
| 8 | +项目需要先准备一个Redis服务,在本地启动一个即可。还需要有一个已经使用session但是未做session共享的Spring Boot项目,下面我就讲述一下如何给这个项目加上基于redis的session共享。 |
| 9 | + |
| 10 | +#### 引入依赖 #### |
| 11 | +首先,要在maven中加入以下依赖: |
| 12 | + |
| 13 | +```xml |
| 14 | +<dependencies> |
| 15 | + <dependency> |
| 16 | + <groupId>org.springframework.session</groupId> |
| 17 | + <artifactId>spring-session</artifactId> |
| 18 | + <version>1.2.2.RELEASE</version> |
| 19 | + </dependency> |
| 20 | + <dependency> |
| 21 | + <groupId>org.springframework.boot</groupId> |
| 22 | + <artifactId>spring-boot-starter-redis</artifactId> |
| 23 | + </dependency> |
| 24 | + <dependency> |
| 25 | + <groupId>org.springframework.session</groupId> |
| 26 | + <artifactId>spring-session-data-redis</artifactId> |
| 27 | + <version>1.2.2.RELEASE</version> |
| 28 | + <type>pom</type> |
| 29 | + </dependency> |
| 30 | +</dependencies> |
| 31 | +``` |
| 32 | + |
| 33 | +#### 配置Redis #### |
| 34 | +在项目目前在使用的properties文件中,加入如下配置: |
| 35 | + |
| 36 | + spring.redis.host=localhost |
| 37 | + spring.redis.password=secret |
| 38 | + spring.redis.port=6379 |
| 39 | + |
| 40 | +#### Spring配置 #### |
| 41 | +在项目的目录中,创建一个Config.java文件(名称随意) |
| 42 | + |
| 43 | +```Java |
| 44 | +@Configuration |
| 45 | +@EnableRedisHttpSession |
| 46 | +public class Config { |
| 47 | + |
| 48 | + @Bean |
| 49 | + public JedisConnectionFactory connectionFactory() { |
| 50 | + return new JedisConnectionFactory(); |
| 51 | + } |
| 52 | +} |
| 53 | +``` |
| 54 | + |
| 55 | +@EnableRedisHttpSession这个注解就是最重要的东西,加了它之后,spring生产一个新的拦截器,用来实现Session共享的操作,具体实现这里暂不展开。而配置的这个Bean,则是让Spring根据配置文件中的配置连到Redis。 |
| 56 | + |
| 57 | +#### 测试 #### |
| 58 | +首先我们开启两个tomcat服务,端口分别为8080和9090,在application.properties中进行设置 |
| 59 | + |
| 60 | + server.port=8080 |
| 61 | + |
| 62 | +接下来定义一个Controller: |
| 63 | + |
| 64 | +```Java |
| 65 | +@RestController |
| 66 | +@RequestMapping(value = "/admin/v1") |
| 67 | +public class QuickRun { |
| 68 | + @RequestMapping(value = "/first", method = RequestMethod.GET) |
| 69 | + public Map<String, Object> firstResp (HttpServletRequest request){ |
| 70 | + Map<String, Object> map = new HashMap<>(); |
| 71 | + request.getSession().setAttribute("request Url", request.getRequestURL()); |
| 72 | + map.put("request Url", request.getRequestURL()); |
| 73 | + return map; |
| 74 | + } |
| 75 | + |
| 76 | + @RequestMapping(value = "/sessions", method = RequestMethod.GET) |
| 77 | + public Object sessions (HttpServletRequest request){ |
| 78 | + Map<String, Object> map = new HashMap<>(); |
| 79 | + map.put("sessionId", request.getSession().getId()); |
| 80 | + map.put("message", request.getSession().getAttribute("map")); |
| 81 | + return map; |
| 82 | + } |
| 83 | +} |
| 84 | +``` |
| 85 | + |
| 86 | +启动之后进行访问测试,首先访问8080端口的tomcat,返回 |
| 87 | + |
| 88 | +> {"request Url":"http://localhost:8080/admin/v1/first"} |
| 89 | +
|
| 90 | +接着,我们访问8080端口的sessions,返回: |
| 91 | + |
| 92 | +> {"sessionId":"efcc85c0-9ad2-49a6-a38f-9004403776b5","message":"http://localhost:8080/admin/v1/first"} |
| 93 | +
|
| 94 | +最后,再访问9090端口的sessions,返回: |
| 95 | + |
| 96 | +> {"sessionId":"efcc85c0-9ad2-49a6-a38f-9004403776b5","message":"http://localhost:8080/admin/v1/first"} |
| 97 | +
|
| 98 | +可见,8080与9090两个服务器返回结果一样,实现了session的共享 |
| 99 | + |
| 100 | +如果此时再访问9090端口的first的话,首先返回: |
| 101 | + |
| 102 | +> {"request Url":"http://localhost:9090/admin/v1/first"} |
| 103 | +
|
| 104 | +而两个服务器的sessions都是返回: |
| 105 | + |
| 106 | +> {"sessionId":"efcc85c0-9ad2-49a6-a38f-9004403776b5","message":"http://localhost:9090/admin/v1/first"} |
| 107 | +
|
| 108 | + |
0 commit comments