redis自定义配置

1、为什么 依赖了web-session就可以使用redis了?

因为我们引入了 web-session.xml

问: 我们如何在项目中使用web-session呢?
答: redis session的使用

2、web-session.xml做了什么

场景介绍:HttpSession 是通过 Servlet 容器创建和管理的,像 Tomcat/Jetty 都是保存在内存中的。而如果我们把 web 服务器搭建成分布式的集群,然后利用 LVS 或 Nginx 做负载均衡,那么来自同一用户的 Http 请求将有可能被分发到两个不同的 web 站点中去。那么问题就来了,如何保证不同的 web 站点能够共享同一份 session 数据呢?
解决方案:使用框架的会话管理工具,也就是spring-session ,可以理解是替换了 Servlet 那一套会话管理,接管创建和管理 Session 数据的工作。既不依赖容器,又不需要改动代码,并且是用了 spring-data-redis 那一套连接池,可以说是最完美的解决方案。
具体实现: (已有同学提供实现文档)
spring-session 的介绍
spring-session 的使用
spring session官方文档

我们的session数据是存放在哪里的呢?我们是存放在redis中的。

redis概要:REmote DIctionary Server(Redis) 是一个高性能的key-value内存数据库。之所以说是内存数据库,是因为redis基于内存的读取和写入相比传统的数据库基于磁盘IO快上数倍。
jedis概要:那jedis就是集成了redis的一些命令操作,封装了redis的java客户端。提供了连接池管理。一般不直接使用jedis,而是在其上在封装一层,作为业务的使用。
由于我们项目是spring框架,可以使用spring 封装的 redis [Spring Data Redis]。Spring Data Redis提供了四种Redis服务的Java客户端包的集成,分别是 Jedis ,JRedis , SRP and Lettuce
参考文档:
redis 命令文档
可视化redis工具下载

image.png

3、自定义配置

由于技术保障部给大家提供了统一使用的包,自然需要提供大家可以自定义配置自己项目的功能。例如设置session或者cookie的过期时间。这也是这篇文档相对重点的部分。
在我们自定义配置过程中,我们不是使用继承的方式来覆盖配置的。我们实际做的是把它作为一个bean使用。Spring初始化的时候会扫描包, 然后 bean对象由Spring接管, 对象内可以注入其他bean对象, 在这里就是注入了 DefaultCookieSerializer 或RedisHttpSessionConfiguration的 bean对象, 而默认的bean对象都是单例的, 所以你这里修改了这个bean对象, 那么系统中这个配置也就改掉了。相当于直接覆盖。

1 . 配置存在于浏览器的cookie

image.png

具体分析:有兴趣可以看以下org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration的源码,里面提供的方法都会告诉你提供了哪些配置。摘自-自定义redisoperationssessionrepository官方文档

  • maxInactiveIntervalInSeconds - the amount of time before the session will expire in seconds

  • redisNamespace - allows configuring an application specific namespace for the sessions. Redis keys and channel IDs will start with the prefix of <redisNamespace>:.

  • redisFlushMode - allows specifying when data will be written to Redis. The default is only when save is invoked on SessionRepository. A value of RedisFlushMode.IMMEDIATE will write to Redis as soon as possible.

2.配置存在于服务器的session

image.png

具体分析:大家有兴趣可进入 org.springframework.session.web.http.DefaultCookieSerializer 看一下,里面分别设置哪些参数。以下是可以配置的参数列表:摘自-自定义cookie配置官方文档

  • cookieName - the name of the cookie to use Default "SESSION"
    // cookie名称,默认是SESSION
  • useSecureCookie - specify if a secure cookie be used Default use value of HttpServletRequest.isSecure() at the time of creation.// 在创建时默认使用HttpServletRequest.isSecure()的值
  • cookiePath - the path of the cookie Default is context root
    // cookie路径,默认是内容跟目录的路径
  • cookieMaxAge - specifies the max age of the cookie to be set at the time the session is created. Default is -1 which indicates the cookie will be removed when the browser is closed.
    // 指定在创建会话时要设置的Cookie的最大年龄。默认值是-1,这意味着当浏览器关闭时cookie将被删除。
  • jvmRoute - specifies a suffix to be appended to the session id and included in the cookie. Used to identify which JVM to route to for session affinity. With some implementations (i.e. Redis) this provides no performance benefit. However, this can help with tracing logs of a particular user.
  • domainName - allows specifying a specific domain name to be used for the cookie. This option is simple to understand, but will likely require a different configuration between development and production environments. See domainNamePattern as an alternative.
    // 允许指定用于Cookie的特定域名。建议使用domainNamePattern作为备选方案,因为正式和测试的选项不一样。
  • domainNamePattern - a case insensitive pattern used to extract the domain name from the HttpServletRequest#getServerName(). The pattern should provide a single grouping used to extract the value of the cookie domain. If the regular expression does not match, no domain is set and the existing domain will be used. If the regular expression matches, the first grouping will be used as the domain.
    // 正则匹配域名

4、配置后的现象

实验方案:建立2个页面,分别名为:about.page, help.page
我在 about.page 写如下代码

// 往redis设值的过程
String unionId = "bbbb";
WebUser user = userDelegator.weixinGetSession(unionId);

String uid = user.getUid();
String sessionId = user.getSessionId();
session.setAttribute("uid", uid);
session.setAttribute("sessionId", sessionId);
String sessionGetId = session.getId();
System.out.println("sessionGetId " + sessionGetId);
System.out.println("uid:" +  session.getAttribute("uid"));
System.out.println("sessionId:" +  session.getAttribute("sessionId"));

我在 help.page 写如下代码

// 从redis取值
System.out.println("uid" +  session.getAttribute("uid"));
System.out.println("sessionId" +  session.getAttribute("sessionId"));

运行页面 结果:


image.png

测试结论

  1. 当我打开about页面以后,我浏览器cookie中的JSSESSION就是我插入redis 的key,我根据cookie中JSESSIONID的值去redis里面查找,可以redis可视化街面上看见,我插入的参数。都是与我配置的相一致。
  2. 当我600s以内打开about页面或help页面,我的JSESSIONID没有变化,但当我600s以后再打开页面about页面或help页面,cookie中的JSESSIONID发生了改变。也就是说600s后,我之前的会话ID已经失效。页面对你这个人访问的记录已经重置。
  3. 600s+300s后(600s 是我在cookie里面设置的过期时间,而session中key的过期时间是在cookie过期时间的基础上+300s = 900s)可视化里的那条记录将提示您过期。提示文案如下:
    Cannot open value tab: Cannot load key spring:session:campaign:expirations:1538208900000 because it doesn't exist in database. Please reload connection tree and try again.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容