Skip to content

Commit b73a9da

Browse files
committed
Spring Boot Session共享
1 parent 3cbf5c7 commit b73a9da

1 file changed

Lines changed: 108 additions & 0 deletions

File tree

SpringBoot_Session_Share/README.md

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
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

Comments
 (0)