一、cookie:
在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据。
二、session:
session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些session信息还是绰绰有余的。
三、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采用的就是这种方式,但是也可以替换成其他形式
一、模拟无法记忆客户端上次访问的真实后端服务器
在上篇负载均衡基础上:tomcat实现负载均衡
1 修改两个后端服务器的测试文件:
vim /usr/local/tomcat/webapps/ROOT/toto.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>
2 、重新启动tomcat
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
3 、使用物理主机进行访问:http:172.25.13.140/toto.jsp
结论:连续访问负载均衡器,其根本会不会将用户定位到在之所访问的后端服务器,并且每一次访问的session ID 都不一致。
二、nginx设置添加sticky(粘滞)模块
nginx设置添加sticky模块,将同一客户端的再次访问请求永久的定位到其上次访问的真实后端服务器上去。
使用nginx-1.10版本;在nginx配置文件中增加tomcat模块,为了实现session共享,需要支持sticky(粘滞)模块
1 、准备安装包
tar zxf nginx-sticky-module-ng.tar.gz -C /usr/local/ # sticky(粘滞)安装包到指定位置
tar zxf nginx-1.10.1.tar.gz # 解压nginx安装包
2 、编译安装nginx
./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/usr/local/nginx-sticky-module-ng
make && make install
3 、设置软链接,方便使用nginx命令
ln -s /usr/local/lnmp/nginx/sbin/nginx /sbin/
4 、修改配置文件,添加tomcat模块以及sticky模块
vim /usr/local/lnmp/nginx/conf/nginx.conf
upstream tomcat {
sticky;
server 172.25.13.140:8080;
server 172.25.13.120:8080;
}
gzip on; #开启gzip
location / {
root /usr/local/tomcat/webapps/ROOT;
index index.html index.htm;
}
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
nginx
5 、重新加载,启动nginx
6 、测试:再次刷新页面,访问的ID号不会变,实现了sticky
三、实现session共享
上面的设置存在一种情况:
目前物理主机一致访问的是这一台后端服务器:
Server Info: 172.25.13.140 : 8080
ID ADCD3BCF32F3F3334AD0912BC2F739F6
将这台服务器的tamcat服务关闭,模拟服务其宕机
[root@toto4 nginx-1.10.1]# cd /usr/local/tomcat/
[root@toto4 tomcat]# bin/shutdown.sh
再次使用物理机进行访问:其会转移到另外的后端服务器。
Server Info: 172.25.13.120 : 8080
ID 3646896BDA1D306FF523797E9AC79D9F
再次开启之前关闭的服务,物理主机所连接的主机不会再调回。
Server Info: 172.25.13.120 : 8080
ID 3646896BDA1D306FF523797E9AC79D9F
这样极为的不安全,且服务器发生故障时,会丢失数据,所以要设置session共享(交叉存储)的方式
(所有的后端服务器都进行)
需要准备以下数据包:
asm-3.2.jar
kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-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
1 将以上数据包拷贝到/usr/local/tomcat/lib目录
[root@toto4 jar]# cp * /usr/local/tomcat/lib/
[root@toto4 jar]# cd /usr/local/tomcat/lib/
[root@toto4 lib]# rm -fr memcached-session-manager-tc6-1.6.3.jar # 删除掉重复的
[root@toto4 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
2 编辑/usr/local/tomcat/conf/context.xml文件,加入session共享配置
ontext.xml 该文件的作用是配置各种数据库的连接池
XML概念
xml常用于数据存储和传输,文件后缀为 .xml
它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言
标记,指计算机所能理解的信息符号;
通过此种标记,计算机之间可以处理包含各种信息的文章等
1 标记,指计算机所能理解的信息符号;
2 通过此种标记,计算机之间可以处理包含各种信息的文章等。
XML设计用来传送及携带数据信息,不用来表现或展示数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。而HTML语言则用来表现数据
172.25.13.140:
34 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
35 memcachedNodes="n1:172.25.13.140:11211,n2:172.25.13.120:11211"
36 failoverNodes="n1"
37 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
38 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoder Factory"
39 />
40 </Context>
172.25.13.120:
34 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
35 memcachedNodes="n1:172.25.13.140:11211,n2:172.25.13.120:11211"
36 failoverNodes="n2"
37 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
38 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoder Factory"
39 />
40 </Context>
3 、重新启动两台服务器的tomcat
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
4 、在两台服务器安装memcached并开启
yum install memcached.x86_64 -y
systemctl start memcached.service
5 、测试
172.25.13.140 —>n1
172.25.13.120—>n2
设置完成后,访问172.25.13.140的客户生成的session ID 存储在172.25.13.120的memcached中。
Server Info: 172.25.13.120 : 8080
ID CC1B2E82FA5A8F6C3D0065354D8D4E08-n1
关闭172.25.13.120的tomcat
Server Info: 172.25.13.140 : 8080
ID CC1B2E82FA5A8F6C3D0065354D8D4E08-n1
重新开启172.25.13.120的tomcat ,关闭172.25.13.140的tomcat
Server Info: 172.25.13.120 : 8080
ID CC1B2E82FA5A8F6C3D0065354D8D4E08-n1
开启172.25.13.140的tomcat,关闭172.25.13.140的memcached
Server Info: 172.25.13.120 : 8080
ID CC1B2E82FA5A8F6C3D0065354D8D4E08-n2
开启172.25.13.140的memcached,关闭172.25.13.120的memcached
Server Info: 172.25.13.120 : 8080
ID CC1B2E82FA5A8F6C3D0065354D8D4E08-n1
以上可以看出,在设置的交叉存储之后,客户一旦成功连接,从开始到结束,再次连接的时候ID都没有改变。