A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 项老师 黑马粉丝团   /  2018-3-14 17:59  /  1241 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

【合肥校区】SpringBoot应用之分布式会话
本文主要讲怎么在spring boot应用里头搭建分布式会话。对于分布式的应用来说,用户的会话管理通常有Session Stick,Session复制,Session集中管理,基于Cookie管理四种方式。各自点评一下:
  • Session Stick
    需要某个用户的会话与某台服务器想绑定,有点耦合
  • Session复制
    每台服务器都有全部的会话信息,会话同步需要时间,另外每台服务器都有全量数据也是个问题
  • Session集中管理
    单独的会话服务,不需要同步,但是同样有网络开销,另外需要处理单点问题
  • 基于Cookie管理
    把session数据放在cookie中,增加网络载荷,另外也存在安全问题。

本文主要关注集中式Session方面,其实现主要有两种方案,一种是容器相关的,比如基于Tomcat的tomcat-redis-session-manager以及基于Jetty的jetty-session-redis等等;另一种就是容器解耦的,就是今天要集成的Spring-Session。
[url=]配置redis集群[/url]
[url=]新建项目[/url]
1.png
[url=]配置application.properties[/url]
[AppleScript] 纯文本查看 复制代码
#1.3.0.RELEASE以后的版本使用
server.session.timeout=10
#server.session-timeout=10 #1.2.7.RELEASE以及之前的版本使用
spring.redis.host=192.168.99.100 #这个就是docker machine default虚拟机的ip
#spring.redis.password=secret
spring.redis.port=6379
[url=]测试Controller[/url]
[AppleScript] 纯文本查看 复制代码
/**
 * Created by patterncat on 
 */
@RestController
@RequestMapping("/session")
public class HelloController {

    @RequestMapping("/uid")
    String uid(HttpSession session) {
        UUID uid = (UUID) session.getAttribute("uid");
        if (uid == null) {
            uid = UUID.randomUUID();
        }
        session.setAttribute("uid", uid);
        return session.getId();
    }
}
[url=]启动[/url]
访问http://localhost:8080/session/uid
[AppleScript] 纯文本查看 复制代码
d1b1cc0c-519e-431a-973c-6c742a014660
[url=]查看redis[/url]
[AppleScript] 纯文本查看 复制代码
docker@default:~$ docker exec -it redis-master /bin/bash
root@86784a615b3d:/data# redis-cli keys '*'
1) "spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660"
2) "spring:session:expirations:1453639380000"
相当于
[AppleScript] 纯文本查看 复制代码
SADD spring:session:expirations:<expire-rounded-up-to-nearest-minute> <session-id> 
EXPIRE spring:session:expirations:<expire-rounded-up-to-nearest-minute> 1800
expirations:1453639380000表示该session将在1453639380000这个时刻被删除。
1800表示1800秒,即30分钟,默认30分钟过期。
[url=]看看session对象[/url]
[AppleScript] 纯文本查看 复制代码
127.0.0.1:6379> hkeys spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660
1) "sessionAttr:uid"
2) "lastAccessedTime"
3) "maxInactiveInterval"
4) "creationTime"
127.0.0.1:6379> hget spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660 sessionAttr:uid
"\xac\xed\x00\x05sr\x00\x0ejava.util.UUID\xbc\x99\x03\xf7\x98m\x85/\x02\x00\x02J\x00\x0cleastSigBitsJ\x00\x0bmostSigBitsxp\xa0E\xe3\x1d\xf9K\xecW6\xcf\xbc\xfbU\x13M\x88"
127.0.0.1:6379> hget spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660 lastAccessedTime
"\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01Rs\x8d\x12b"
30分钟过后已经过期
[AppleScript] 纯文本查看 复制代码
127.0.0.1:6379> hget spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660 creationTime --raw
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> keys *
(empty list or set)
再刷新网页得到新的sessionid
[AppleScript] 纯文本查看 复制代码
3ed21473-c5ee-41e1-b64e-35b0737c0365
[url=]问题[/url]
设置的timeout没有生效,都以1800秒为准了。经验证,得这样设置才有效:
[AppleScript] 纯文本查看 复制代码
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60) //1分钟失效


9 个回复

倒序浏览
回复 使用道具 举报
给力点赞 666
回复 使用道具 举报
给力点赞 666
回复 使用道具 举报
666
回复 使用道具 举报
程序员小虾米 来自手机 初级黑马 2018-3-15 17:53:52
地板
66666666赞
回复 使用道具 举报
小皖妹妹 来自手机 黑马粉丝团 2018-3-15 18:22:47
7#
[哇],点击[ http://pinyin.cn/e136293 ]查看表情
回复 使用道具 举报
666
回复 使用道具 举报
回复 使用道具 举报
666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马