3.1 同域名下相同项目(集群环境)实现Session共享

在同一个域名下,比如:www.p2p.com
同一个项目,部署了多台tomcat,这就是典型的集群。我们的入门案例就属于这种应用场景,只不过在实际开发的过程中,我们如果存在了tomcat集群,那么肯定会使用nginx进行负载均衡,那么这种情况下我们该如何处理。

3.1.1 案例设计思路

我们将上一个阶段的p2p项目实现集群部署下的Session共享,因为我们只是演示Session共享,所以我们试用一个简易版本的p2p,在我给大家提供的资料中,该p2p中只包含p2p和dataservice,在Linux服务器上,我们准备三台tomcat,其中两台部署p2p,并实现session共享,另一台部署dataservice

3.1.2 架构图

image.png

3.1.3 实现步骤

1)使用Xftp将p2p上传到tomcat9100和9200的webapps目录下

image.png
image.png

2)使用Xftp将dataservice上传到tomcat9300的webapps目录下

image.png

3)使用资源下的SQL脚本,重新创建数据库的表

因为目前这个p2p的项目表结构和上一个阶段的稍微有些区别,所以我们这里更新一下

A、启动mysql数据库

image.png

B、通过MySQL客户端工具Navivat创建新的库

image.png

C、指定数据库名字为p2p2,字符集编码为utf-8

image.png

D、新建查询,执行p2p-data.sql脚本

image.png

E、执行成功后,表结构如下

image.png

4)通过Xftp工具连接Linux,修改tomcat9300下的dataservice的连接信息

A、使用记事本打开,修改redis.properties,保存

image.png

B、修改datasource.properties,保存

image.png

C、修改applicationContext-dubbo-provide.xml注册中心的地址,并保存

image.png

5)通过Xftp工具连接Linux,修改tomcat9100下的p2p的连接信息

这里只需要修改applicationContext-dubbo-consumer.xml文件中zk注册中心的地址即可
image.png

6)通过Xftp工具连接Linux,修改tomcat9200下的p2p的连接信息

这里只需要修改applicationContext-dubbo-consumer.xml文件中zk注册中心的地址即可
image.png

7)确保Linux系统上的各应用服务器启动

注意:先通过ps –ef | grep XXX命令查看,如果已经启动,就不需要再启动了

A、启动ZooKeeper服务器

image.png

B、启动MySQL服务器

image.png

C、启动Redis服务器

image.png

D、启动tomcat9300服务器(为了避免出错先关闭,再启动)

image.png

E、启动tomcat9100服务器(为了避免出错先关闭,再启动)

image.png

F、启动tomcat9200服务器(为了避免出错先关闭,再启动)

image.png

G、直接访问tomcat的方式,在浏览器输入地址访问tomcat9100和tomcat9200

image.png
image.png

8)使用Nginx对tomcat9100和tomcat9200进行负载均衡

A、负载均衡的配置,这里使用的是轮询策略

upstream www.p2p.com{
server 127.0.0.1:9100;
server 127.0.0.1:9200;
}
image.png

B、location匹配的配置,注意:这里对静态资源的处理,我们暂时先注释掉

location /p2p{
proxy_pass http://www.p2p.com;
}
如果要是实现了静态代理,别忘了启动所有的nginx服务器(负载|代理)
image.png

C、重启Nginx

image.png

E、在浏览器中输入地址,直接访问Nginx服务器,实现负载均衡

image.png

9)Nginx对集群负载均衡之后,登录不成功,但是直接访问tomcat9100或者tomcat9200都是可以成功登录的(Session丢失)

账号:13700000000 密码:123456


分析原因**
因为默认我们负载均衡使用的是轮询策略,每次发送请求给nginx服务器,都会切换tomcat服务器,这个时候没有使用任何session共享策略,所以登录不成功

10)Nginx对集群负载均衡之后,Session共享方案

A、修改nginx.conf配置文件,将轮询策略修改为ip_hash

image.png
但是这种情况,一旦ip发生变化,或者某台服务器出现故障,会重新分配,不稳定
所以我们看下这种情况后,将ip_hash注释掉
image.png

B、使用SpringSession

使用Spring Session实现session共享,我们不需要修改代码,只要修改一些配置文件即可,为了演示方便,我们直接使用Xftp修改已经发布到tomcat上的项目

  • 向tomcat9100和tomcat9200的p2p项目中加jar包,这个jar包我已经准备好了

image.png
image.png

  • 修改tomcat9100和tomcat9200的p2p项目的web.xml配置文件,添加Spring Session过滤器,因为我们项目本身已经通过springMVC启动了容器,所以spring监听器不需要加了,直接从01-springsession-web中拷贝即可

image.png
image.png

  • 将01-springsession-web项目中resources下的applicationContext-session.xml和redis.properties拷贝到tomcat9100和tomcat9200的p2p项目WEB-INF/classes下

image.png
image.png

  • 修改tomcat9100和tomcat9200的p2p项目WEB-INF/classes下的applicationContext.xml文件,引入applicationContext-session.xml

image.png
image.png

  • 重启三台tomcat服务器,浏览器访问进行登录测试,可以实现Session共享

    3.2 同域名下不同项目实现Session共享

    在同一个域名下,有多个不同的项目(项目的上下文根不一样)比如:
    www.web.com/p2p
    www.web.com/shop
    如图:
    image.png

    3.2.1 做法:设置Cookie路径为根/上下文

    3.2.2 案例设计思路

    在01-springsession-web项目的基础上,将本地tomcat9100的上下文根修改为p2p,将本地tomcat9200的上下文根修改为shop

    3.2.3 实现步骤

    1)打开Edit Configurations进行配置

    image.png

    2)在Deployment选项卡下,设置本地tomcat9100的Application context为/p2p

    image.png

    3)在Deployment选项卡下,设置本地tomcat9200的Application context为/shop

    image.png

    4)在idea中重新启动本地的两台tomcat服务器

    5)在浏览器中访问tomcat9100(p2p),设置session

    image.png

    6)在浏览器中访问tomcat9200(shop),获取session

    image.png

    7)分析Session共享失败原因

    我们通过浏览器提供的开发人员工具可以发现,这两个请求的cookie的路径(path)不一致,虽然我们已经加了Spring Session共享机制,但是后台服务器认为这是两个不同的会话(session),可以通过Redis客户端工具(Redis Destop Mananger)查看,先清空,然后访问,发现是维护了两个不同的session,所以不能实现共享
    image.png

    8)解决方案 设置Cookie路径为根/上下文

    在applicationContext-session.xml文件中,加如下配置: ```xml
  1. <a name="0npJa"></a>
  2. #### 9)在idea中重新启动本地的两台tomcat服务器
  3. <a name="Ivb5K"></a>
  4. #### 10)在浏览器中访问tomcat9100(p2p),设置session
  5. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12558654/1614409666181-06cb2b3f-633b-4a9f-af83-69741ac298ad.png#align=left&display=inline&height=90&margin=%5Bobject%20Object%5D&name=image.png&originHeight=180&originWidth=1134&size=102769&status=done&style=none&width=567)
  6. <a name="G8GOQ"></a>
  7. #### 11)在浏览器中访问tomcat9200(shop),获取session
  8. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12558654/1614409694019-1bf82b9b-9a94-4854-9da4-fed1617a18b3.png#align=left&display=inline&height=85&margin=%5Bobject%20Object%5D&name=image.png&originHeight=169&originWidth=1129&size=119916&status=done&style=none&width=564.5)<br />**注意:测试的时候要先清空浏览器缓存**<br />**
  9. <a name="G5qGx"></a>
  10. ## 3.3 同根域名不同二级子域名下的项目实现Session共享
  11. 同一个根域名,不同的二级子域名<br />比如:<br /> www.web.com<br /> beijing.web.com<br /> nanjing.web.com<br />如图:<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12558654/1614409781015-07cef844-0eac-4498-bacd-99c3aaeb867b.png#align=left&display=inline&height=319&margin=%5Bobject%20Object%5D&name=image.png&originHeight=637&originWidth=1142&size=217463&status=done&style=none&width=571)
  12. <a name="Io99z"></a>
  13. ### 3.3.1 做法
  14. - 设置Cookie路径为根/上下文,项目名一样的话,此步骤可以省略
  15. - 设置cookie的域名为根域名 web.com
  16. <br />
  17. <a name="48apn"></a>
  18. ### 3.3.2 案例设计思路
  19. 在01-springsession-web项目的基础上,将本地tomcat9100的上下文根修改为p2p,将本地tomcat9200的上下文根修改为shop;在本机host文件中修改127.0.0.1的映射关系模拟不同的域名访问
  20. <a name="7eYS8"></a>
  21. ### 3.3.3 实现步骤
  22. <a name="bAobh"></a>
  23. #### 1)延续上面的案例的配置,两台本地tomcat服务器9100和9200,上下文根分别是p2p和shop
  24. <a name="tMDhw"></a>
  25. #### 2)修改本地hosts文件,加入如下配置
  26. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12558654/1614409891290-089dd0a4-b513-4b45-bed0-0ad25090ff61.png#align=left&display=inline&height=29&margin=%5Bobject%20Object%5D&name=image.png&originHeight=58&originWidth=491&size=24596&status=done&style=none&width=245.5)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12558654/1614409903702-eaeebe39-c392-49ee-9284-6e0a857fd516.png#align=left&display=inline&height=69&margin=%5Bobject%20Object%5D&name=image.png&originHeight=138&originWidth=697&size=69677&status=done&style=none&width=348.5)
  27. <a name="EpRoS"></a>
  28. #### 3)在idea中重新启动本地的两台tomcat服务器
  29. <a name="w4sKK"></a>
  30. #### 4)在浏览器中访问tomcat9100(p2p),设置session
  31. > **注意,这里不再使用localhost访问,而是使用我们映射的域名**
  32. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12558654/1614409960264-99be8b85-0244-4f1e-87e9-605665c48141.png#align=left&display=inline&height=101&margin=%5Bobject%20Object%5D&name=image.png&originHeight=201&originWidth=1133&size=118858&status=done&style=none&width=566.5)
  33. <a name="M6EKj"></a>
  34. #### 5)在浏览器中访问tomcat9200(shop),获取session
  35. > **注意,这里也不再使用localhost访问,而是使用我们映射的域名**
  36. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12558654/1614409992092-e1db7fe0-05ca-4064-bdc6-f3ad916728a3.png#align=left&display=inline&height=114&margin=%5Bobject%20Object%5D&name=image.png&originHeight=227&originWidth=1141&size=120817&status=done&style=none&width=570.5)
  37. <a name="HRwUq"></a>
  38. #### 6)分析Session共享失败原因
  39. 我们通过浏览器提供的开发人员工具可以发现,虽然这两个cookie的路径(path)都设置为了“/”,但是这两个cookie的域名不一致,虽然我们已经加了Spring Session共享机制,但是后台服务器同样认为这是两个不同的会话(session),可以通过Redis客户端工具(Redis Destop Mananger)查看,先清空,然后访问,发现是维护了两个不同的session,所以不能实现共享,也就是说后台区分是否同一个session和路径和域名有关。
  40. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12558654/1614410059011-3170c429-bcda-48eb-9131-741a0216365e.png#align=left&display=inline&height=34&margin=%5Bobject%20Object%5D&name=image.png&originHeight=68&originWidth=1083&size=36640&status=done&style=none&width=541.5)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12558654/1614410071378-0e72552a-1cdd-44ae-bcd0-af1f71b65fb0.png#align=left&display=inline&height=47&margin=%5Bobject%20Object%5D&name=image.png&originHeight=93&originWidth=1081&size=45102&status=done&style=none&width=540.5)
  41. <a name="lYlVx"></a>
  42. #### 7)解决方案 设置Cook ie的域名为根域名 web.com
  43. 在applicationContext-session.xml文件中,加如下配置:<br />**注意:域名要和hosts文件中配置的域名后面一样**
  44. ```xml
  45. <!--设置cookie的存放方式具体实现-->
  46. <bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer">
  47. <property name="cookiePath" value="/"/>
  48. <property name="domainName" value="web.com"/>
  49. </bean>

image.png

8)在idea中重新启动本地的两台tomcat服务器

9)在浏览器中访问tomcat9100(p2p),设置session

image.png

10)在浏览器中访问tomcat9200(shop),获取session

image.png
注意:清空浏览器缓存
**

1.1 单点登录(了解)

不同根域名下的项目实现Session共享,
比如阿里巴巴这样的公司,有多个业务线,多个网站,用户在一个网站登录,那么其他网站也会是登录了的状态,比如:登录了淘宝网,则天猫网也是登录的;
www.taobao.com
www.tmall.com
比如:
www.web.com
www.p2p.com
www.dai.com
对于不同根域名的场景,要实现一处登录,处处登录,Spring Session不支持
单点登录(Single Sign On),简称为 SSO,是流行的企业业务整合的解决方案之一,SSO是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统