场景
springboot服务
现有1个主域名和3个子域名,部署了4个服务。
我需要他们在相互切换页面的时候共享一个session保持登陆状态。
qjuzi.com
article.qjuzi.com
user.qjuzi.com
book.qjuzi.com
解决办法
启用spring-redis和spring-session-redis的session共享功能。
步骤1 启动redis服务
# ubuntu16.04
$ apt-get install redis-server
$ vim /etc/redis/redis.conf # 注掉bind,以便使用外网访问
$ service redis restart
步骤2 配置springboot
#gradle dependences
compile “todo-todo-todo”
# file: application.properties
spring.redis.host=redis.qjuzi.com
spring.redis.port=6379
@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
defaultCookieSerializer.setCookieName("sessionId"); //cookie 名字
defaultCookieSerializer.setDomainName("qjuzi.com"); // 域
defaultCookieSerializer.setCookiePath("/"); // 存储路径
return defaultCookieSerializer;
}
}
@Controller
public class SessionTestController {
@ResponseBody
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request) {
return request.getSession().getId();
}
}
步骤3 启动多个服务
这里我启用两个服务来测试。
# file:application.properties
# 修改端口参数,用端口8080和9090
server.port=8080
# 控制台1
# server.port=8080
$ gradle bootRun
# 控制台2
# server.port=9090
$ gradle bootRun
步骤4 nginx反向代理配置
server {
listen 80;
server_name article.qjuzi.com;
location / {
proxy_pass http://localhost:8080/;
}
}
server {
listen 80;
server_name book.qjuzi.com;
location / {
proxy_pass http://localhost:9090/;
}
}
步骤5 浏览器测试
测试结果如下,获得了同样的Session Id.
book.qjuzi.com/getSession > 051214ea-257b-4e65-8af2-65236120ede9
article.qjuzi.com/getSession > 051214ea-257b-4e65-8af2-65236120ede9
提示
正式环境下,redis需要采用稳定的服务,不对外部开放
参考及引用
httpsession-redis
Spring Session - HttpSession (Quick Start)
网友评论