资料来源:https://www.bilibili.com/video/BV1iK411p7dZ
Spring Session版本 1.3.1RELEASE
Spring Session Redis版本 1.3.1RELEASE
Spring Data Redis版本 1.8.8.RELEASE
Jedis版本 2.9.0
Spring Web版本 4.3.16

第1章 Session会话管理概述

一、Web中的Session和Cookie回顾

image.png

1、Session机制

由于HTTP协议是无状态的协议,一次浏览器和服务器的交互过程就是:
浏览器:你好吗?
服务器:很好!
这就是一次会话,对话完成后,这次会话就结束了,服务器端并不能记住这个人,下次再对话时,服务器端并不知道是上一次的这个人,所以服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户,这个机制就是Session。

2、Cookie

服务端如何识别特定的客户?
这个时候需要使用Cookie。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。
实际上大多数的应用都是用Cookie 来实现Session跟踪的,第一次创建Session时,服务端会在HTTP协议中向客户端 Cookie 中记录一个Session ID,以后每次请求把这个会话ID发送到服务器,这样服务端就知道客户端是谁了。

3、url重写

那么如果客户端的浏览器禁用了Cookie 怎么办?
一般这种情况下,会使用一种叫做URL重写的技术来进行session会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sessionId=xxxxx 这样的参数,服务端据此来识别客户端是谁

二、Session会话管理及带来的问题

  1. Web项目开发中,Session会话管理是一个很重要的部分,用于存储与记录用户的状态或相关的数据。<br /> 通常情况下session交由容器(tomcat)来负责存储和管理,但是如果项目部署在多台tomcat中,则session管理存在很大的问题:
  • 多台tomcat之间无法共享session,比如用户在tomcat A服务器上已经登录了,但当负载均衡跳转到tomcat B时,由于tomcat B服务器并没有用户的登录信息,session就失效了,用户就退出了登录
  • 一旦tomcat容器关闭或重启也会导致session会话失效

    因此如果项目部署在多台tomcat中,就需要解决session共享的问题
    image.png

    三、Session会话共享方案

    1、第一种是使用容器扩展插件来实现,比如基于Tomcat的tomcat-redis-session-manager插件,基于Jetty的jetty-session-redis插件、memcached-session-manager插件;这个方案的好处是对项目来说是透明的,无需改动代码,但是由于过于依赖容器,一旦容器升级或者更换意味着又得重新配置
    其实底层是,复制session到其它服务器,所以会有一定的延迟,也不能部署太多的服务器。
    2、第二种是使用Nginx负载均衡的ip_hash策略实现用户每次访问都绑定到同一台具体的后台tomcat服务器实现session总是存在。
    这种方案的局限性是ip不能变,如果手机从北京跳到河北,那么ip会发生变化;另外负载均衡的时候,如果某一台服务器发生故障,那么会重新定位,也会跳转到别的机器。
    3、第三种是自己写一套Session会话管理的工具类,在需要使用会话的时候都从自己的工具类中获取,而工具类后端存储可以放到Redis中,这个方案灵活性很好,但开发需要一些额外的时间。
    4、第四种是使用框架的会话管理工具,也就是我们要介绍的Spring session,这个方案既不依赖tomcat容器,又不需要改动代码,由Spring session框架为我们提供,可以说是目前非常完美的session共享解决方案

    第2章 Spring Session入门

    一、Spring Session简介

    Spring Session 是Spring家族中的一个子项目,它提供一组API和实现,用于管理用户的session信息
    它把servlet容器实现的httpSession替换为spring-session,专注于解决 session管理问题,Session信息存储在Redis中,可简单快速且无缝的集成到我们的应用中;
    官网:https://spring.io/

Spring Session的特性

  • 提供用户session管理的API和实现
  • 提供HttpSession,以中立的方式取代web容器的session,比如tomcat中的session
  • 支持集群的session处理,不必绑定到具体的web容器去解决集群下的session共享问题

    二、入门案例

    1、环境配置

    (1)创建一个空的Maven project,名字及路径根据自己的情况定。
    图片1.png
    (2)空project创建好后,会提示创建模块,我们暂时先取消
    图片2.png
    (3)设置字体
    图片3.png
    (4)设置编码方式
    图片4.png
    (5)设置maven信息
    图片5.png
    (6)创建一个Maven的web module,名字为01-springsession-web
    图片6.png
    (7)完善Maven项目的结构
    图片7.png
    A、 在main目录下,创建java目录,并标记为Sources Root
    图片8.png
    B、 在main目录下,创建resources目录,并标记为Resources Root
    图片9.png

    2、代码开发

    2.1 创建向session放数据的servlet

    1)在java目录下创建包com.bjpowernode.session.servlet包
    图片10.png
    2)在servlet包下创建SetSessionServlet
    图片11.png图片12.png
    3)在Servlet中通过注解指定urlPatterns,并编写代码
    图片13.png

    2.2 创建从session放数据的servlet

    1)在servlet包下创建GetSessionServlet
    图片14.png图片15.png
    2)在Servlet中通过注解指定urlPatterns,并编写代码
    图片16.png

    2.3 向pom.xml文件中添加servlet及jsp的配置

    1. <dependencies>
    2. <!-- servlet依赖的jar包start -->
    3. <dependency>
    4. <groupId>javax.servlet</groupId>
    5. <artifactId>javax.servlet-api</artifactId>
    6. <version>3.1.0</version>
    7. </dependency>
    8. <!-- servlet依赖的jar包start -->
    9. <!-- jsp依赖jar包start -->
    10. <dependency>
    11. <groupId>javax.servlet.jsp</groupId>
    12. <artifactId>javax.servlet.jsp-api</artifactId>
    13. <version>2.3.1</version>
    14. </dependency>
    15. <!-- jsp依赖jar包end -->
    16. <!--jstl标签依赖的jar包start -->
    17. <dependency>
    18. <groupId>javax.servlet</groupId>
    19. <artifactId>jstl</artifactId>
    20. <version>1.2</version>
    21. </dependency>
    22. <!--jstl标签依赖的jar包end -->
    23. </dependencies>

    2.4 部署访问测试(目前无法实现session共享)

    (1)配置tomcat9100服务器
    ① 打开Edit Configurations选项
    图片17.png
    ② 添加tomcat配置
    图片18.png
    ③ 给tomcat服务器取名,并修改端口号
    图片19.png
    ④ 将项目部署到tomcat9100上
    图片20.png
    ⑤ 指定项目的上下文根为/01-springsession-web
    图片21.png
    ⑥ 为了实现热部署,在Server选项卡中,配置以下两个选项
    图片22.png
    (2)配置tomcat9200服务器
    操作步骤同配置tomcat9100,配完之后在Application Servers窗口中如下
    图片23.png

    3、SpringSession集成配置

    3.1 添加Spring Session依赖

    ```xml

    org.springframework.session spring-session-data-redis 1.3.1.RELEASE

org.springframework spring-web 4.3.16.RELEASE <a name="SUqFb"></a> #### 3.2 web.xml中配置springSessionRepositoryFilter过滤器xml springSessionRepositoryFilter org.springframework.web.filter.DelegatingFilterProxy springSessionRepositoryFilter / <a name="i0ERG"></a> #### 3.3 web.xml中加载Spring配置文件xml contextConfigLocation classpath:applicationContext.xml org.springframework.web.context.ContextLoaderListener <a name="Q2hAO"></a> #### 3.4 创建applicationContext-session.xml ① 配置一个RedisHttpSessionConfiguration类<br /><context:annotation-config/>:用于激活已经在Spring容器中注册的bean或者注解,因为我们通过容器创建的bean中,底层有可能使用了其它的注解,我们通过<context:component-scan>就不能指定具体的包了,所以可以使用<context:annotation-config/>激活xml ② 配置Spring-data-redisxml <a name="jH27C"></a> #### 3.5 配置redis.properties文件xml redis.hostName=192.168.235.128 redis.port=6379 redis.password=123456 redis.usePool=true redis.timeout=15000 <a name="qcyiD"></a> #### 3.6 applicationContext.xml中导入applicationContext-session.xml ![图片24.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117260189-e9f1f160-72c2-4aa5-94f4-738643f72370.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=124&id=u8295aa9b&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8724.png&originHeight=171&originWidth=919&originalType=binary&ratio=1&rotation=0&showTitle=false&size=27330&status=done&style=none&taskId=u36ed22e7-a209-4426-b1c8-5c9a3c084b2&title=&width=666)<br />点击config将这两个配置文件进行关联<br />![图片25.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117273660-d55780d5-7010-4ba2-8a45-af49f8866476.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=188&id=u6769036e&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8725.png&originHeight=236&originWidth=810&originalType=binary&ratio=1&rotation=0&showTitle=false&size=26135&status=done&style=none&taskId=uad5fa696-7ee3-4d17-ac34-764ad78aef1&title=&width=645) <a name="HkLQR"></a> ### **4、部署测试** 4.1 思路<br />为了演示session的共享,我们这里配置两个tomcat服务器,端口号分别为9100和9200,将我们上面创建好的项目分别部署到这两台服务器上。一台服务器执行放session,另一台服务器执行取session的操作<br />4.2 启动Linux上的redis服务器<br />4.3 启动两台tomcat服务器<br />(1)在浏览器中访问tomcat9100服务器的setSession<br />![图片26.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117310305-2b048248-ec1a-4658-933d-8da6183a74b7.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=121&id=ufd81e20d&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8726.png&originHeight=133&originWidth=729&originalType=binary&ratio=1&rotation=0&showTitle=false&size=19205&status=done&style=none&taskId=u2d5b55eb-35c8-40c7-b8ae-b7f103da49c&title=&width=665)<br />(2)在浏览器中访问tomcat9200服务器的getSession<br />![图片27.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117321266-3c812635-7dc5-4106-8a2c-f9b97bc3e960.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=105&id=ubf5f29b9&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8727.png&originHeight=105&originWidth=669&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14766&status=done&style=none&taskId=u6bded5cb-8d71-44b1-bf6c-1ad45866908&title=&width=669)<br />4.4 分析<br />tomcat9200服务器上的项目可以访问tomcat9100上的session,说明session共享成功<br />4.5 进一步验证<br />打开Resis客户端工具(RedisDesktopManager),查看Redis里面的session数据<br />其实标准的redis的key格式就是用冒号分割,客户端工具会以目录的形式展示<br /> ![图片28.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117339146-467a2bff-e8ab-4d92-a87a-566fe8baa43a.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=106&id=u80797178&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8728.png&originHeight=174&originWidth=1131&originalType=binary&ratio=1&rotation=0&showTitle=false&size=21020&status=done&style=none&taskId=u3fbf0ccf-1667-42e4-a82b-758360fffd0&title=&width=687) <a name="W8gEf"></a> # **第3章 Spring Session常见的应用场景** <a name="Qodxd"></a> ## **一、同域名下相同项目(集群环境)实现Session共享** 在同一个域名下,比如:[www.p2p.com](http://www.p2p.com)<br />同一个项目,部署了多台tomcat,这就是典型的集群。我们的入门案例就属于这种应用场景,只不过在实际开发的过程中,我们如果存在了tomcat集群,那么肯定会使用nginx进行负载均衡,那么这种情况下我们该如何处理。 <a name="weod3"></a> ### **1、案例设计思路** 我们将上一个阶段的p2p项目实现集群部署下的Session共享,因为我们只是演示Session共享,所以我们试用一个简易版本的p2p,在我给大家提供的资料中,该p2p中只包含p2p和dataservice,在Linux服务器上,我们准备三台tomcat,其中两台部署p2p,并实现session共享,另一台部署dataservice <a name="O1NAF"></a> ### **2、架构图** ![图片29.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117460364-37e4fba0-dcdc-4e98-8700-e0d388f1a8b5.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=319&id=uda2f9422&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8729.png&originHeight=369&originWidth=759&originalType=binary&ratio=1&rotation=0&showTitle=false&size=36138&status=done&style=none&taskId=u8d5e00a6-c6c0-4519-a8e0-07ee5282792&title=&width=656) <a name="tUVJN"></a> ### **3、实现步骤** 3.1 使用Xftp将p2p上传到tomcat9100和9200的webapps目录下<br />![图片30.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117539548-f82c0a89-11e1-49af-abe5-2e629d4e837e.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=194&id=u69f7d8e4&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8730.png&originHeight=387&originWidth=1357&originalType=binary&ratio=1&rotation=0&showTitle=false&size=50151&status=done&style=none&taskId=u328f43fd-4933-4518-9afe-4b07d218852&title=&width=680)<br />![图片31.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117549356-a924d8e9-95a0-4201-a93e-c9742bff27dd.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=176&id=u4e249b1c&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8731.png&originHeight=336&originWidth=1353&originalType=binary&ratio=1&rotation=0&showTitle=false&size=50162&status=done&style=none&taskId=u7001b654-4cb8-4849-bc23-d71e6891b56&title=&width=710)<br />3.2 使用Xftp将dataservice上传到tomcat9300的webapps目录下<br />![图片32.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117566851-f5d4e37e-06c6-4342-a962-80a9b9c23acf.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=168&id=u7bcff3de&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8732.png&originHeight=325&originWidth=1363&originalType=binary&ratio=1&rotation=0&showTitle=false&size=47967&status=done&style=none&taskId=u8c9e6cd0-08a8-45ff-964a-44328f0a62d&title=&width=703)<br />3.3 使用资源下的SQL脚本,重新创建数据库的表<br />因为目前这个p2p的项目表结构和上一个阶段的稍微有些区别,所以我们这里更新一下<br />① 启动mysql数据库<br />![图片33.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117580526-b72ad7d3-8fc3-4123-baa2-47aa088c5043.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=76&id=udd5cba95&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8733.png&originHeight=76&originWidth=512&originalType=binary&ratio=1&rotation=0&showTitle=false&size=3286&status=done&style=none&taskId=u145c868d-c8c2-4b07-ac78-c75aa5284df&title=&width=512)<br />② 通过MySQL客户端工具Navivat创建新的库<br />![图片34.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117586692-7d8ddbda-166d-4197-a87f-65e4ff02960b.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=321&id=ud0421a1f&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8734.png&originHeight=391&originWidth=317&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23444&status=done&style=none&taskId=u48570093-d650-4e95-9ec4-a8ea5936c47&title=&width=260)<br />③ 指定数据库名字为p2p2,字符集编码为utf-8<br />![图片35.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117594885-301f74ab-2796-4d81-aaf7-02fa6577aa40.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=265&id=u77c768bc&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8735.png&originHeight=398&originWidth=456&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14811&status=done&style=none&taskId=u4cb87705-92f7-446c-a211-53e16120c77&title=&width=304)<br />④ 新建查询,执行p2p-data.sql脚本<br />![图片36.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117602123-9d009013-46c6-4db4-9cc7-aadc533913dc.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=289&id=ud4e7115c&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8736.png&originHeight=654&originWidth=1337&originalType=binary&ratio=1&rotation=0&showTitle=false&size=134010&status=done&style=none&taskId=ubc077686-e5a4-49e8-a1fe-487aa2b138c&title=&width=591)<br />⑤ 执行成功后,表结构如下<br />![图片37.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117612691-b6b2421f-09e0-4f25-87e0-4c8b7e4b02f5.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=255&id=ucadf088e&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8737.png&originHeight=447&originWidth=1087&originalType=binary&ratio=1&rotation=0&showTitle=false&size=73427&status=done&style=none&taskId=u8c0e9625-4d91-4e19-b8bb-8cf98fd1572&title=&width=621)<br />3.4 通过Xftp工具连接Linux,修改tomcat9300下的dataservice的连接信息<br />① 使用记事本打开,修改redis.properties,保存<br />![图片38.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117623366-bb2e3d91-d075-42fa-be0f-fcfd11c704cf.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=418&id=u62d144ce&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8738.png&originHeight=485&originWidth=678&originalType=binary&ratio=1&rotation=0&showTitle=false&size=53908&status=done&style=none&taskId=u7702b5d2-b34b-4ad6-a601-e1700122ed8&title=&width=585)<br />② 修改datasource.properties,保存<br />![图片39.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117650867-4becf6ae-6f96-4238-b83c-eba564bf7dd3.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=369&id=ua15e79c2&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8739.png&originHeight=492&originWidth=788&originalType=binary&ratio=1&rotation=0&showTitle=false&size=59075&status=done&style=none&taskId=u7c8616f8-c0cf-4d48-a39c-c223ae4ebfb&title=&width=591)<br />③ 修改applicationContext-dubbo-provide.xml注册中心的地址,并保存<br />![图片40.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117672842-f876d823-9982-4045-b80b-7809e0e63da2.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=257&id=u3fe032f4&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8740.png&originHeight=400&originWidth=1017&originalType=binary&ratio=1&rotation=0&showTitle=false&size=48360&status=done&style=none&taskId=uf85cc427-d775-43f2-a412-f9235a658ec&title=&width=654)<br />3.5 通过Xftp工具连接Linux,修改tomcat9100下的p2p的连接信息<br />这里只需要修改applicationContext-dubbo-consumer.xml文件中zk注册中心的地址即可<br />![图片41.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117694670-4650554b-bac6-4fb1-b797-c13d406a7446.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=286&id=u7bac74c0&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8741.png&originHeight=400&originWidth=931&originalType=binary&ratio=1&rotation=0&showTitle=false&size=46173&status=done&style=none&taskId=ude37f527-d4ba-41e4-8f7b-782e6207428&title=&width=665)<br />3.6 通过Xftp工具连接Linux,修改tomcat9200下的p2p的连接信息<br />这里只需要修改applicationContext-dubbo-consumer.xml文件中zk注册中心的地址即可<br />![图片42.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117707111-467587ad-ccd5-4dc9-aeda-6da28eeac5ff.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=344&id=u31b52eeb&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8742.png&originHeight=523&originWidth=999&originalType=binary&ratio=1&rotation=0&showTitle=false&size=62299&status=done&style=none&taskId=ucea7a33b-f5d5-4781-a5d9-fc47cdcec3f&title=&width=658)<br />3.7 确保Linux系统上的各应用服务器启动<br />注意:先通过ps –ef | grep XXX命令查看,如果已经启动,就不需要再启动了<br />A、启动ZooKeeper服务器<br />![图片43.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117719280-7794d846-d5d4-4f1d-bd62-9801486e88f5.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=177&id=u362c0707&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8743.png&originHeight=236&originWidth=904&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15437&status=done&style=none&taskId=uaf843c0c-fe84-4972-bcbe-32634da90aa&title=&width=678)<br />A、启动MySQL服务器<br />![图片44.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117728691-4165c33b-73e7-4fd7-b334-a9ad93b0a1af.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=227&id=u528dd0bf&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8744.png&originHeight=351&originWidth=1041&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23589&status=done&style=none&taskId=u856467c6-d9fa-4944-86ea-cb5c2af4b19&title=&width=673)<br />B、启动Redis服务器<br />![图片45.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117736886-e288119f-9d01-483e-8df8-6888c2457e8a.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=81&id=u5246595b&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8745.png&originHeight=101&originWidth=835&originalType=binary&ratio=1&rotation=0&showTitle=false&size=6591&status=done&style=none&taskId=u8fb09d8b-6e19-4fbf-ab58-d7431a4d34e&title=&width=666)<br />C、启动tomcat9300服务器(为了避免出错先关闭,再启动)<br />![图片46.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117744519-cbff267f-f380-4d14-b1f6-8b7404b0b607.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=139&id=u04ed685f&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8746.png&originHeight=218&originWidth=1080&originalType=binary&ratio=1&rotation=0&showTitle=false&size=16479&status=done&style=none&taskId=ue75231e4-de6b-4963-a2cc-d10ff3201cd&title=&width=687)<br />D、启动tomcat9100服务器(为了避免出错先关闭,再启动)<br />![图片47.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117751206-c9bfd2a1-a4e5-4b0b-83bd-3431a93f2f0c.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=147&id=ue91eb536&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8747.png&originHeight=234&originWidth=1077&originalType=binary&ratio=1&rotation=0&showTitle=false&size=17062&status=done&style=none&taskId=u7a41e153-2434-414d-abed-84524e5934c&title=&width=677)<br />E、启动tomcat9200服务器(为了避免出错先关闭,再启动)<br />![图片48.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117762873-3e72f262-c005-4591-9075-ce3213004528.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=136&id=u4fa2be79&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8748.png&originHeight=221&originWidth=1077&originalType=binary&ratio=1&rotation=0&showTitle=false&size=16279&status=done&style=none&taskId=uee9442b2-10a6-46d0-b198-624da36bf27&title=&width=664)<br />F、直接访问tomcat的方式,在浏览器输入地址访问tomcat9100和tomcat9200<br />![图片49.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117772972-8b8d0815-b374-4311-9181-a845cd89b9c1.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=307&id=u3162b457&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8749.png&originHeight=673&originWidth=1350&originalType=binary&ratio=1&rotation=0&showTitle=false&size=514357&status=done&style=none&taskId=ubaf65cd1-8772-4d51-9f39-af9d0812b58&title=&width=616)<br />![图片50.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117785642-c5b830f8-19bd-4faf-bf84-cacc18884860.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=339&id=u566c876e&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8750.png&originHeight=678&originWidth=1350&originalType=binary&ratio=1&rotation=0&showTitle=false&size=722869&status=done&style=none&taskId=u76ddbccf-f9b7-4045-9ddf-998c0722fcf&title=&width=675)<br />3.8 使用Nginx对tomcat9100和tomcat9200进行负载均衡<br />① 负载均衡的配置,这里使用的是轮询策略xml upstream www.p2p.com{ server 127.0.0.1:9100; server 127.0.0.1:9200;
} ② location匹配的配置,注意:这里对静态资源的处理,我们暂时先注释掉xml location /p2p{ proxy_pass http://www.p2p.com; } 如果要是实现了静态代理,别忘了启动所有的nginx服务器(负载|代理)<br />![图片52.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117826025-f01527a8-6786-48da-b151-2894a87bc733.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=194&id=u750be6aa&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8752.png&originHeight=217&originWidth=772&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13777&status=done&style=none&taskId=u24354930-5ab0-42af-940c-7358cf527c8&title=&width=690)<br />③ 重启Nginx<br />![图片53.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117841062-f0932c2b-59a6-48f8-b901-4f9c935ba3d9.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=160&id=u1992320b&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8753.png&originHeight=279&originWidth=1073&originalType=binary&ratio=1&rotation=0&showTitle=false&size=22912&status=done&style=none&taskId=u90e37df5-8f70-4321-b684-2aa18e56ba0&title=&width=614)<br />④ 在浏览器中输入地址,直接访问Nginx服务器,实现负载均衡<br />![图片54.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117848681-4b1ec1be-26b0-4b3f-afd8-19d5c8e40963.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=360&id=uaadd6da9&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8754.png&originHeight=725&originWidth=1349&originalType=binary&ratio=1&rotation=0&showTitle=false&size=438661&status=done&style=none&taskId=u474c8f9f-deac-4ad6-b0ee-3c3bb38a556&title=&width=670)<br />3.9 Nginx对集群负载均衡之后,登录不成功,但是直接访问tomcat9100或者tomcat9200都是可以成功登录的(Session丢失)<br />账号:13700000000 密码:123456<br />分析原因:<br />因为默认我们负载均衡使用的是轮询策略,每次发送请求给nginx服务器,都会切换tomcat服务器,这个时候没有使用任何session共享策略,所以登录不成功<br />3.10 Nginx对集群负载均衡之后,Session共享方案<br />**① 修改nginx.conf配置文件,将轮询策略修改为ip_hash**<br />![图片55.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117864927-f27e9296-1b3d-4a15-8bf1-13ad52383e7d.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=129&id=u808082b5&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8755.png&originHeight=129&originWidth=357&originalType=binary&ratio=1&rotation=0&showTitle=false&size=3392&status=done&style=none&taskId=ude8f42e0-bfb5-4539-acab-fa1ff8468d2&title=&width=357)<br />但是这种情况,一旦ip发生变化,或者某台服务器出现故障,会重新分配,不稳定<br />所以我们看下这种情况后,将ip_hash注释掉<br />![图片56.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117883941-a6c192f0-333f-4e93-9cf0-612b3a2c7f71.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=120&id=u1713d27e&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8756.png&originHeight=120&originWidth=308&originalType=binary&ratio=1&rotation=0&showTitle=false&size=3271&status=done&style=none&taskId=u9eddd7f3-73f4-474e-8e95-016ded0d305&title=&width=308)<br />**② 使用SpringSession**<br />使用Spring Session实现session共享,我们不需要修改代码,只要修改一些配置文件即可,为了演示方便,我们直接使用Xftp修改已经发布到tomcat上的项目<br />1)向tomcat9100和tomcat9200的p2p项目中加jar包,这个jar包我已经准备好了<br />![图片57.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117932675-b64fd24f-2791-4503-8a06-0867b9b89810.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=226&id=ua5003b1f&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8757.png&originHeight=512&originWidth=1357&originalType=binary&ratio=1&rotation=0&showTitle=false&size=102447&status=done&style=none&taskId=u36c51434-cc86-4434-a128-00a4d481ece&title=&width=599)<br />![图片58.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117939279-1bea6d5f-8ed3-460c-a171-edd487737f37.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=246&id=ud9ae5683&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8758.png&originHeight=520&originWidth=1353&originalType=binary&ratio=1&rotation=0&showTitle=false&size=102124&status=done&style=none&taskId=u2186a694-61ed-4b48-8bbd-d71f938303a&title=&width=641)<br />2)修改tomcat9100和tomcat9200的p2p项目的web.xml配置文件,添加Spring Session过滤器,因为我们项目本身已经通过springMVC启动了容器,所以spring监听器不需要加了,直接从01-springsession-web中拷贝即可<br />![图片59.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117957018-349e4b0c-b9a0-48ca-b711-39ca5ce69ba0.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=334&id=uea84bc87&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8759.png&originHeight=550&originWidth=963&originalType=binary&ratio=1&rotation=0&showTitle=false&size=53697&status=done&style=none&taskId=uda946910-455f-44e4-a51f-9ca5a18b693&title=&width=585)<br />![图片60.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117965596-4fd73dac-5da4-4a9a-8507-ca51eef694ac.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=330&id=u3846b961&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8760.png&originHeight=547&originWidth=979&originalType=binary&ratio=1&rotation=0&showTitle=false&size=54921&status=done&style=none&taskId=u87e6d8d9-67ad-4543-b314-1601812a8d2&title=&width=590)<br />3)将01-springsession-web项目中resources下的applicationContext-session.xml和redis.properties拷贝到tomcat9100和tomcat9200的p2p项目WEB-INF/classes下<br />![图片61.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117976843-07028209-4271-4085-9ddf-abb7eea5f554.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=248&id=u43dbd3dd&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8761.png&originHeight=277&originWidth=671&originalType=binary&ratio=1&rotation=0&showTitle=false&size=31226&status=done&style=none&taskId=u88e7ff23-d46c-4d4c-9174-6ff30558402&title=&width=600)<br />![图片62.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644117984565-beff9873-8381-4bea-89de-7a0e3949e9a5.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=248&id=u9370d27b&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8762.png&originHeight=267&originWidth=677&originalType=binary&ratio=1&rotation=0&showTitle=false&size=30844&status=done&style=none&taskId=u68ebc631-b5da-4686-b378-d1245be8e70&title=&width=630)<br />4)修改tomcat9100和tomcat9200的p2p项目WEB-INF/classes下的applicationContext.xml文件,引入applicationContext-session.xml<br />![图片63.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118007758-f4360e7f-3888-40d2-b108-8e5f5e7c602d.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=344&id=u99dca9d0&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8763.png&originHeight=415&originWidth=685&originalType=binary&ratio=1&rotation=0&showTitle=false&size=44818&status=done&style=none&taskId=ue2630044-dfc9-4772-99bc-d16db6acb92&title=&width=567)<br />![图片64.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118013816-639e020f-03d9-476e-9723-b43e1fa3108c.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=325&id=u5ba0fbb6&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8764.png&originHeight=377&originWidth=686&originalType=binary&ratio=1&rotation=0&showTitle=false&size=42446&status=done&style=none&taskId=u169a84e9-1365-4ce9-8dff-e2d60d31b05&title=&width=592)<br />5)重启三台tomcat服务器,浏览器访问进行登录测试,可以实现Session共享 <a name="IJkoq"></a> ## **二、同域名下不同项目实现Session共享** 在同一个域名下,有多个不同的项目(项目的上下文根不一样)比如:<br /> www.web.com/p2p<br /> www.web.com/shop<br /> 如图:<br />![图片65.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118037971-1c35bcf9-feb1-4533-a1a2-e69c722fefae.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=238&id=ub13a6216&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8765.png&originHeight=274&originWidth=649&originalType=binary&ratio=1&rotation=0&showTitle=false&size=30619&status=done&style=none&taskId=u0daf48f9-7d1e-4819-ada2-ca341c95508&title=&width=564) <a name="JW8xR"></a> ### **1、做法** 设置Cookie路径为根/上下文 <a name="Jojwd"></a> ### **2、案例设计思路** 在01-springsession-web项目的基础上,将本地tomcat9100的上下文根修改为p2p,将本地tomcat9200的上下文根修改为shop <a name="o0CPF"></a> ### **3、实现步骤** 3.1 打开Edit Configurations进行配置<br />![图片66.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118054698-e1edefc4-b551-495a-b8f3-8c756b0dea6a.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=92&id=u6b96ae13&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8766.png&originHeight=92&originWidth=163&originalType=binary&ratio=1&rotation=0&showTitle=false&size=5526&status=done&style=none&taskId=u5196157f-69d2-4634-8627-5821004ac62&title=&width=163)<br />3.2 在Deployment选项卡下,设置本地tomcat9100的Application context为/p2p<br /> ![图片67.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118077832-302bd096-0d77-4cf7-8525-aadf042f8698.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=215&id=u6fb6b474&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8767.png&originHeight=250&originWidth=766&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15827&status=done&style=none&taskId=uaca8043f-fa4a-4784-b92e-e7d559ad68b&title=&width=659)<br />3.3 在Deployment选项卡下,设置本地tomcat9200的Application context为/shop<br />![图片68.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118085413-5064a4a0-9bac-403f-968f-80ab543a13b6.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=214&id=uf5fa7fb8&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8768.png&originHeight=239&originWidth=767&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15891&status=done&style=none&taskId=ua28d1ee7-46b0-4ce1-97a6-7cac5f404f0&title=&width=687)<br />3.4 在idea中重新启动本地的两台tomcat服务器<br />3.5 在浏览器中访问tomcat9100(p2p),设置session<br />![图片69.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118097873-4f9a19af-3f5a-4009-a9f4-7505919cfd4a.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=94&id=u2c075a72&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8769.png&originHeight=101&originWidth=642&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13879&status=done&style=none&taskId=u12448d23-35ed-4564-9f03-cada5a230be&title=&width=600)<br />3.6 在浏览器中访问tomcat9200(shop),获取session<br />![图片70.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118104874-5153cc67-7578-4774-974a-6163f7db39be.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=91&id=uf6eeb045&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8770.png&originHeight=102&originWidth=744&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14639&status=done&style=none&taskId=ubcead872-8b08-4b0a-887b-f89aa367fce&title=&width=663)<br />**3.7 分析Session共享失败原因**<br />我们通过浏览器提供的开发人员工具可以发现,这两个请求的cookie的路径(path)不一致,虽然我们已经加了Spring Session共享机制,但是后台**服务器认为这是两个不同的会话(session)**,可以通过Redis客户端工具(Redis Destop Mananger)查看,先清空,然后访问,发现是维护了两个不同的session,所以不能实现共享<br />![图片71.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118116805-4f4baac6-5a0b-4deb-a88f-d56022be7b3e.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=97&id=u187b7b71&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8771.png&originHeight=189&originWidth=1366&originalType=binary&ratio=1&rotation=0&showTitle=false&size=36512&status=done&style=none&taskId=ua9993752-6aba-4daf-8fb8-9fe1153bc3b&title=&width=699)<br />3.8 解决方案:**设置Cookie路径为根/上下文**<br />在applicationContext-session.xml文件中,加如下配置:xml ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644127954584-5cb720c3-c6fb-4faf-82d1-b41a2d03ef07.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=498&id=udab29a0a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=498&originWidth=1578&originalType=binary&ratio=1&rotation=0&showTitle=false&size=791902&status=done&style=none&taskId=u2de034f0-949e-4ff6-a243-a7494d5846a&title=&width=1578)<br />3.9 在idea中重新启动本地的两台tomcat服务器<br />3.10 在浏览器中访问tomcat9100(p2p),设置session<br />![图片72.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118143227-cbd52af0-ef5e-48f8-9a89-b81d898b2f42.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=101&id=u0ba4605b&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8772.png&originHeight=101&originWidth=642&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13879&status=done&style=none&taskId=u80c0dbc1-c373-432e-908f-34a2f7ee39f&title=&width=642)<br />3.11 在浏览器中访问tomcat9200(shop),获取session<br />![图片73.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118150080-69ba02f0-bfa1-4933-951c-fa752d29b8fa.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=94&id=uf64aeee4&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8773.png&originHeight=94&originWidth=637&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14743&status=done&style=none&taskId=u1f5fd8c1-8e0e-48b9-bc00-2eda0334812&title=&width=637)<br />**注意:测试的时候要先清空浏览器缓存** <a name="RXJp1"></a> ## **三、同根域名不同二级子域名下的项目实现Session共享** 同一个根域名,不同的二级子域名<br />比如:<br /> www.web.com<br /> beijing.web.com<br /> nanjing.web.com<br />如图:<br />![图片74.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118174649-4406d846-ea74-4a61-8d1c-f783560c849d.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=291&id=u933f3472&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8774.png&originHeight=345&originWidth=615&originalType=binary&ratio=1&rotation=0&showTitle=false&size=41770&status=done&style=none&taskId=uf42d3888-a7a5-4650-9962-b25419df6f3&title=&width=519) <a name="eUm96"></a> ### **1、做法** - 设置Cookie路径为根/上下文,项目名一样的话,此步骤可以省略 - 设置cookie的域名为根域名 web.com <a name="moNDn"></a> ### **2、案例设计思路** 在01-springsession-web项目的基础上,将本地tomcat9100的上下文根修改为p2p,将本地tomcat9200的上下文根修改为shop;在本机host文件中修改127.0.0.1的映射关系模拟不同的域名访问 <a name="kgoA2"></a> ### **3、实现步骤** 3.1 延续上面的案例的配置,两台本地tomcat服务器9100和9200,上下文根分别是p2p和shop<br />3.2 修改本地hosts文件,加入如下配置<br />![图片75.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118225131-b86ce039-a1ad-42e8-985e-4a0be37c8880.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=26&id=uf3d7e80d&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8775.png&originHeight=26&originWidth=227&originalType=binary&ratio=1&rotation=0&showTitle=false&size=2252&status=done&style=none&taskId=u5a296a4f-772a-4113-a638-aa074223565&title=&width=227)<br />![图片76.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118232131-e0dca49e-cd46-45c4-a0ee-e2cc43a67784.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=72&id=ue0d86100&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8776.png&originHeight=72&originWidth=336&originalType=binary&ratio=1&rotation=0&showTitle=false&size=3084&status=done&style=none&taskId=uea0adf79-78c9-41e8-abd6-cadb4480b99&title=&width=336)<br />3.3 在idea中重新启动本地的两台tomcat服务器<br />3.4 在浏览器中访问tomcat9100(p2p),设置session<br />注意:这里不再使用localhost访问,而是使用我们映射的域名<br />![图片77.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118248193-29de7576-85b8-4ec4-b86f-9fdea69d2b9b.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=102&id=ud3f8b9dd&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8777.png&originHeight=102&originWidth=584&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13116&status=done&style=none&taskId=u6e5391d6-da55-4e51-962d-209ab53057c&title=&width=584)<br />3.5 在浏览器中访问tomcat9200(shop),获取session<br />注意,这里也不再使用localhost访问,而是使用我们映射的域名<br /> ![图片78.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118258901-c5b4fe4f-21f1-4a6f-a9d8-162471262773.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=108&id=u496711c5&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8778.png&originHeight=108&originWidth=622&originalType=binary&ratio=1&rotation=0&showTitle=false&size=14551&status=done&style=none&taskId=uea06f338-f160-4404-ac42-a209c8f091f&title=&width=622)<br />**3.6 分析Session共享失败原因**<br />我们通过浏览器提供的开发人员工具可以发现,虽然这两个cookie的路径(path)都设置为了“/”,但是这两个cookie的域名不一致,虽然我们已经加了Spring Session共享机制,但是后台**服务器同样认为这是两个不同的会话(session)**,可以通过Redis客户端工具(Redis Destop Mananger)查看,先清空,然后访问,发现是维护了两个不同的session,所以不能实现共享,也就是说后台区分是否同一个session和路径和域名有关。<br />![图片79.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118273572-40ce9cb8-31b3-42cd-8c71-0c1627fecf49.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=48&id=uc69a104a&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8779.png&originHeight=48&originWidth=1366&originalType=binary&ratio=1&rotation=0&showTitle=false&size=12670&status=done&style=none&taskId=u7f9d91cb-9adf-4a37-b07a-6ff754e6340&title=&width=1366)<br />![图片80.png](https://cdn.nlark.com/yuque/0/2022/png/22523384/1644118285330-64061f79-c8c8-4113-a273-a9405abbf841.png#clientId=u69b69593-d9de-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=73&id=u28b60c9d&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%8780.png&originHeight=73&originWidth=1360&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15963&status=done&style=none&taskId=ubb8bdd6b-8f9f-4672-a942-17a749b21f5&title=&width=1360) 3.7 解决方案:**设置Cookie的域名为根域名 web.com**<br />在applicationContext-session.xml文件中,加如下配置:<br />注意:域名要和hosts文件中配置的域名后面一样xml ``` image.png
3.8 在idea中重新启动本地的两台tomcat服务器
3.9 在浏览器中访问tomcat9100(p2p),设置session
图片81.png
3.10 在浏览器中访问tomcat9200(shop),获取session
图片82.png
注意:清空浏览器缓存 ## 四、单点登录(了解) 不同根域名下的项目实现Session共享,
比如阿里巴巴这样的公司,有多个业务线,多个网站,用户在一个网站登录,那么其他网站也会是登录了的状态,比如:登录了淘宝网,则天猫网也是登录的;
www.taobao.com
www.tmall.com
比如:
www.web.com
www.p2p.com
www.dai.com
对于不同根域名的场景,要实现一处登录,处处登录,Spring Session不支持
单点登录(Single Sign On),简称为 SSO,是流行的企业业务整合的解决方案之一,SSO是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统
# *第4章 SpringBoot集成SpringSession
## 1、导入依赖 ```xml org.springframework.boot spring-boot-starter-data-redis

org.springframework.session spring-session-data-redis

  1. <a name="c9mB2"></a>
  2. ## 2、配置文件
  3. ```xml
  4. spring.redis.host=192.168.115.129
  5. spring.redis.port=6379
  6. spring.redis.password=123456
  7. # 设置SpringSession的Session声明周期为30m,表示30分钟,默认为30m
  8. # server.servlet.session.timeout=30m
  9. # 指定Cookie的存放路径为根路径用于实现同域名不同项目的Session共享
  10. # server.servlet.session.cookie.path=/
  11. # 指定Cookie的存域名用于实现同根域名不同二级子域名的Session共享
  12. # server.servlet.session.cookie.domain=myweb.com
  13. server.port=9400

3、编写Controller

  1. import org.springframework.web.bind.annotation.RequestMapping;
  2. import org.springframework.web.bind.annotation.RestController;
  3. import javax.servlet.http.HttpSession;
  4. @RestController
  5. public class TestController {
  6. @RequestMapping("/set")
  7. public Object set(HttpSession session){
  8. session.setAttribute("myKey","我的Session数据!");
  9. return "Session设置成功";
  10. }
  11. @RequestMapping("/get")
  12. public Object get(HttpSession session){
  13. String data= (String) session.getAttribute("myKey");
  14. return data;
  15. }
  16. }

4、编译打包文件

image.png
image.png

5、启动9300服务、9400服务

image.png

6、修改nginx配置

image.png

7、测试执行

image.png

第5章 Spring Session的执行流程(源码分析)

1、页面请求被全局的过滤器org.springframework.web.filter.DelegatingFilterProxy过滤
2、全局的过滤器是一个代理过滤器,它不执行真正的过滤逻辑,它代理了一个Spring容器中的名为:springSessionRepositoryFilter 的一个过滤器
3、代理的这个springSessionRepositoryFilter 过滤器是从spring容器中获取的,真正执行过滤逻辑的是 SessionRepositoryFilter
@Bean注解
相当于:

……..

4、该SessionRepositoryFilter过滤器覆盖了原来servlet中的request和response接口中定义的操作session方法,替换成自己的session方法
5、在过滤的时候,总是会执行一个finally语句块,在finally中提交session,保存到Redis session以hash结构存放在redis
6、默认的过期时间30分钟

  1. <!-- Spring session 的配置类 -->
  2. <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
  3. <!--设置session过期时间,单位是秒,默认是30分钟-->
  4. <property name="maxInactiveIntervalInSeconds" value="3600"/>
  5. <!--设置cookie的存放方式-->
  6. <property name="cookieSerializer" ref="defaultCookieSerializer"/>
  7. </bean>