tomcat实现session交叉存储

一.cookie和session简单介绍
1.cookie
在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据
2.session
session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的
3.cookie和session的结合使用
web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:
(1)存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session
(2)将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式
二.模拟无记忆访问
nginx+tomcat实现负载均衡以后
1.修改两个后端服务器的测试文件

[root@server1 ~]# cd /usr/local/tomcat/
[root@server1 tomcat]# cd webapps/ROOT/
[root@server1 ROOT]# vim luck1.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
[root@server1 ROOT]# scp luck1.jsp root@172.25.4.112:/usr/local/tomcat/webapps/ROOT/  ##将测试文件复制一份给另外一台后端服务器
[root@server1 ROOT]# cd -
/usr/local/tomcat
[root@server1 tomcat]# bin/startup.sh 
[root@server1 tomcat]# nginx
[root@server1 tomcat]# nginx -t
[root@server2 ~]#  cd /usr/local/tomcat/webapps/ROOT/
[root@server2 ROOT]# vim luck1.jsp 
[root@server2 ROOT]# cd ..
[root@server2 webapps]# cd ..
[root@server2 tomcat]# bin/startup.sh 

浏览器端测试:172.25.4.111/luck1.jsp
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
连续访问负载均衡器,其根本会不会将用户定位到在之前所访问的后端服务器,并且每一次访问的session ID 都不一致
三.nginx添加sticky(粘滞)模块
nginx-1.15.9不支持sticky,所以使用nginx-1.10版本,重新编译nginx

[root@server1 lnmp]# nginx -s stop  ##将1.15.9版本的nginx关闭
[root@server1 lnmp]# cd /usr/local/lnmp/
[root@server1 lnmp]# ls
nginx
[root@server1 lnmp]# rm -fr nginx/  ##删除1.15.9版本nginx的所有相关文件
[root@server1 ~]# cd lnmp/
[root@server1 lnmp]# tar zxf nginx-1.10.1.tar.gz
[root@server1 lnmp]# tar zxf nginx-sticky-module-ng.tar.gz -C /usr/local/
[root@server1 lnmp]# cd nginx-1.10.1
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/lnmp/nginx   --with-http_ssl_module --add-module=/usr/local/nginx-sticky-module-ng  ##编译为二进制文件
[root@server1 nginx-1.10.1]# make && make install  ##安装
[root@server1 nginx-1.10.1]# vim /usr/local/lnmp/nginx/conf/nginx.conf  ##编辑主配置文件
http {
    include       mime.types;
    default_type  application/octet-stream;
    upstream tomcat {
        sticky;  ##添加sticky模块
        server 172.25.4.111:8080;
        server 172.25.4.112:8080;
}
    gzip  on;  ##开启gzip
        location / {
            root   /usr/local/tomcat/webapps/ROOT;
            index  index.html index.htm;
        }
        location ~ \.jsp$ {
                proxy_pass http://tomcat;
        }
[root@server1 nginx-1.10.1]# /usr/local/lnmp/nginx/sbin/nginx
[root@server1 ~]# cd /usr/local/tomcat/
[root@server1 tomcat]# bin/shutdown.sh 
[root@server1 tomcat]# bin/startup.sh 

浏览器端测试:http://172.25.4.111/luck1.jsp
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由此可知访问的ID号不变实现了sticky
四.实现session共享
采用sticky模型会在访问后端服务器的时候,一直访问同一台后端服务器

Server Info: 172.25.4.112 : 8080

ID 0026F63DE8D299F840B9A7196A93F1A9

当这台服务器down机

[root@server2 tomcat]# bin/shutdown.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

此时浏览器再次访问:http://172.25.4.111/luck1.jsp
此时由另外一台服务器提供服务

Server Info: 172.25.4.111 : 8080

ID FBDDF306CD9CC2263CA982A1849E4EAE

当这台服务器恢复正常

[root@server2 tomcat]# bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

浏览器再次访问:http://172.25.4.111/luck1.jsp

Server Info: 172.25.4.111 : 8080

ID FBDDF306CD9CC2263CA982A1849E4EAE

此时后端服务器不会被再次调回,仍由另外一台服务器提供服务。极为的不安全,且服务器发生故障时,会丢失数据,所以要设置session共享(交叉存储)的方式

[root@server1 ~]# cd lnmp/
[root@server1 lnmp]# cd jar
[root@server1 jar]# ls
asm-3.2.jar
kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc6-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
minlog-1.2.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar
[root@server1 jar]# cp * /usr/local/tomcat/lib/
[root@server1 jar]# cd /usr/local/tomcat/lib/
[root@server1 lib]# rm -fr memcached-session-manager-tc6-1.6.3.jar  ##删除重复的
[root@server1 lib]# ls
annotations-api.jar                  memcached-session-manager-tc7-1.6.3.jar
asm-3.2.jar                          minlog-1.2.jar
catalina-ant.jar                     msm-kryo-serializer-1.6.3.jar
catalina-ha.jar                      reflectasm-1.01.jar
catalina.jar                         servlet-api.jar
catalina-tribes.jar                  spymemcached-2.7.3.jar
ecj-4.2.1.jar                        tomcat-api.jar
el-api.jar                           tomcat-coyote.jar
jasper-el.jar                        tomcat-dbcp.jar
jasper.jar                           tomcat-i18n-es.jar
jsp-api.jar                          tomcat-i18n-fr.jar
kryo-1.04.jar                        tomcat-i18n-ja.jar
kryo-serializers-0.10.jar            tomcat-jdbc.jar
memcached-session-manager-1.6.3.jar  tomcat-util.jar
[root@server1 lib]# vim /usr/local/tomcat/conf/context.xml 
<Manager 
className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.4.111:11211,n2:172.25.4.112:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[root@server1 lib]# /usr/local/tomcat/bin/shutdown.sh 
[root@server1 lib]# /usr/local/tomcat/bin/startup.sh 
[root@server1 lib]# yum install memcached.x86_64 -y
[root@server1 lib]# systemctl start memcached.service
[root@server2 lnmp]# vim /usr/local/tomcat/conf/context.xml 
<Manager 
className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.4.111:11211,n2:172.25.4.112:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[root@server2 lnmp]# /usr/local/tomcat/bin/shutdown.sh 
[root@server2 lnmp]# /usr/local/tomcat/bin/startup.sh
[root@server2 lnmp]# yum install memcached.x86_64 -y
[root@server2 lnmp]# systemctl start memcached.service

172.25.4.111---->n2
172.25.4.112---->n1
浏览器访问:172.25.4.111/luck1.jsp
在这里插入图片描述

Server Info: 172.25.4.111 : 8080

ID 8C1EF513E52E9ACA70C084B9019A5E34-n2

即客户端在访问172.25.4.111时,生成的sessionID储存在172.25.4.112上
当关闭172.25.4.111上的tomcat时
在这里插入图片描述

Server Info: 172.25.4.112 : 8080

ID 8C1EF513E52E9ACA70C084B9019A5E34-n2

此时服务由172.25.4.112提供
重新开启172.25.4.111的tomcat ,关闭172.25.4.112的tomcat
在这里插入图片描述

Server Info: 172.25.4.111 : 8080

ID 8C1EF513E52E9ACA70C084B9019A5E34-n2

此时服务由172.25.4.111提供,并将生成的ID存储在172.25.4.112上
由此可知:设置的交叉存储之后,客户一旦成功连接,从开始到结束,再次连接的时候ID都没有改变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值