tomcat session服务器会话丢失处理

简介:

session会话保持之session服务器


实验环境:

两个tomcat节点:172.16.100.70(tomcatA.test.com),172.16.100.80(tomcatB.test.com)

两个memcached节点:172.16.100.90, 172.16.100.100

一个负载均衡节点:172.16.100.60



memcached-session-manager项目地址,http://code.google.com/p/memcached-session-manager/


下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。

memcached-session-manager-${version}.jar

memcached-session-manager-tc${6,7,8}-${version}.jar

spymemcached-${version}.jar

msm-javolution-serializer-${version}.jar   内存保持至memcache

javolution-${version}.jar



分别在两个tomcat上的某host上定义一个用于测试的context容器,并在其中创建一个会话管理器,如下所示:


<Context path="/test" docBase="/webapps/test" reloadable="true">

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

                memcachedNodes="n1:172.16.100.9:11211,n2:172.16.100.10:11211"

                failoverNodes="n1"

                requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"       transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/></Context>



分别为两个context提供测试页面:


tomcatA:

# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}

# vim /usr/local/tomcat/webapps/test/index.jsp

添加如下内容:

<%@ page language="java" %>

<html>

  <head><title>TomcatA</title></head>

  <body>

    <h1><font color="red">TomcatA.test.com</font></h1>

    <table align="centre" border="1">

      <tr>

        <td>Session ID</td>

    <% session.setAttribute("test.com","test.com"); %>

        <td><%= session.getId() %></td>

      </tr>

      <tr>

        <td>Created on</td>

        <td><%= session.getCreationTime() %></td>

     </tr>

    </table>

  </body>

</html>



tomcatB:

# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}

# vim /usr/local/tomcat/webapps/test/index.jsp

添加如下内容:

<%@ page language="java" %>

<html>

  <head><title>TomcatB</title></head>

  <body>

    <h1><font color="blue">TomcatB.test.com</font></h1>

    <table align="centre" border="1">

      <tr>

        <td>Session ID</td>

    <% session.setAttribute("test.com","test.com"); %>

        <td><%= session.getId() %></td>

      </tr>

      <tr>

        <td>Created on</td>

        <td><%= session.getCreationTime() %></td>

     </tr>

    </table>

  </body>

</html>



在172.16.100.60上配置反向代理的负载均衡内容,类似如下所示:

upstream vmserver{
    server 172.16.100.70:8080;
    server 172.16.100.80:8080;

}

location / {
    add_header X-Via $upstream_addr;
    proxy_pass http://vmserver;
    index index.jsp index.html;

}



测试结果,在浏览器中访问http://172.16.100.6O/test,结果如下所示,其session ID在负载均衡环境中保持不变。


TomcatA.test.com


Session ID4DD0340CE629BAF2BBEBB2CD4CD0DDDF-n2

Created on4444890838103



TomcatB.test.com


Session ID4DD0340CE629BAF2BBEBB2CD4CD0DDDF-n2

Created on4444890838103






注意:如果你是上面所示的方法设置的Session ID显示是没问题

如果你想测试结果,能直接在浏览器中访问http://172.16.100.6O/那么nginx的设置如下

upstream vmserver{
    server 172.16.100.70:8080;
    server 172.16.100.80:8080;

}

location / {
    add_header X-Via $upstream_addr;
    proxy_pass http://vmserver;
    index index.jsp index.html;

}

这时候就涉及到会话丢失问题了。

nginx会话丢失问题



nginx代理是出现会话丢失   

proxy_cookie_path /test/ /;

proxy_cookie_path路径更换;



发生会话丢失的原因。访问的时候是/   代理到/test     

下次访问时你可以直接持http://xx/test

它的cookie就是test

但是你访问的时候是/

这时候你就需要


proxy_cookie_path /test/ /;

proxy_cookie_path路径更换;


正确设置如下:

upstream vmserver{
    server 172.16.100.70:8080;
    server 172.16.100.80:8080;

}

location / {
    add_header X-Via $upstream_addr;
    proxy_pass http://vmserver/test;

    proxy_cookie_path /test/ /;

     index index.jsp index.html;

}



本文转自 吃草的青蛙 51CTO博客,原文链接:http://blog.51cto.com/tlinux/1727348,如需转载请自行联系原作者
相关文章
|
2月前
|
Java 应用服务中间件 Windows
windows服务器重装系统之后,Tomcat服务如何恢复?
windows服务器重装系统之后,Tomcat服务如何恢复?
53 10
|
18天前
|
安全 Java 应用服务中间件
【服务器知识】Tomcat简单入门
【服务器知识】Tomcat简单入门
|
3月前
|
应用服务中间件 Docker 容器
在服务器中使用Docker安装Tomcat、同时实现目录挂载、并且部署War包到服务器
这篇文章介绍了在Docker中安装Tomcat的过程,包括搜索Tomcat镜像、拉取镜像、目录挂载的准备、创建并挂载容器,以及如何进入容器和进行测试。文中还说明了如何将WAR包部署到Tomcat服务器并访问部署的应用。
在服务器中使用Docker安装Tomcat、同时实现目录挂载、并且部署War包到服务器
|
3月前
|
网络协议 Java 应用服务中间件
Tomcat源码分析 (一)----- 手撕Java Web服务器需要准备哪些工作
本文探讨了后端开发中Web服务器的重要性,特别是Tomcat框架的地位与作用。通过解析Tomcat的内部机制,文章引导读者理解其复杂性,并提出了一种实践方式——手工构建简易Web服务器,以此加深对Web服务器运作原理的认识。文章还详细介绍了HTTP协议的工作流程,包括请求与响应的具体格式,并通过Socket编程在Java中的应用实例,展示了客户端与服务器间的数据交换过程。最后,通过一个简单的Java Web服务器实现案例,说明了如何处理HTTP请求及响应,强调虽然构建基本的Web服务器相对直接,但诸如Tomcat这样的成熟框架提供了更为丰富和必要的功能。
|
15天前
|
存储 弹性计算 安全
阿里云第七代云服务器ECS性能、适用场景与价格参考
阿里云第七代云服务器ECS(Elastic Compute Service)作为阿里云最新一代的高性能计算产品,凭借其基于最新硬件架构和虚拟化技术的全面升级,在计算能力、存储性能、网络传输速度以及灵活性等多个方面实现了显著提升。这一代云服务器旨在为用户提供更为强大、稳定且可定制的云端基础设施服务,广泛适用于从基础的Web托管到复杂的高性能计算等多种应用场景。
|
14天前
|
弹性计算 网络安全
阿里云国际OpenAPI多接口快速管理ECS服务器教程
阿里云国际OpenAPI多接口快速管理ECS服务器教程
|
3天前
|
存储 弹性计算 NoSQL
"从入门到实践,全方位解析云服务器ECS的秘密——手把手教你轻松驾驭阿里云的强大计算力!"
【10月更文挑战第23天】云服务器ECS(Elastic Compute Service)是阿里云提供的基础云计算服务,允许用户在云端租用和管理虚拟服务器。ECS具有弹性伸缩、按需付费、简单易用等特点,适用于网站托管、数据库部署、大数据分析等多种场景。本文介绍ECS的基本概念、使用场景及快速上手指南。
17 3
|
8天前
|
存储 弹性计算 编解码
通过阿里云的活动租赁云服务器时如何选择实例规格?选择指南参考
新手用户通过阿里云的活动租赁云服务器的时候实例规格应该怎么选?目前在阿里云的活动中,可选的云服务器类型除了轻量应用服务器之外,云服务器的主要实例规格有经济型e、通用算力型u1和计算型c7与c8y、通用型g7与g8y、内存型r7与r8y等实例,但是对于新手来说,由于是初次购买,实例规格往往不知道怎么选择了。本文为大家展示阿里云目前活动中各云服务器实例规格性能、适用场景以及选择指南参考。
|
12天前
|
弹性计算 开发框架 .NET
阿里云服务器购买教程及云服务器地域、实例、操作系统、带宽等参数选择指南
对于初次购买阿里云服务器的用户来说,想使用阿里云服务器搭建网站或者运行APP、小程序等项目,第一步就是要先购买阿里云服务器,下面小编以图文形式给大家介绍一下阿里云服务器的购买流程,以及购买过程中如何云服务器地域、实例、带宽等关键配置和选择这些参数的一些注意事项,以供参考。
|
15天前
|
域名解析 网络协议 数据安全/隐私保护
阿里云轻量应用服务器搭建WordPress个人博客教程
阿里云轻量应用服务器搭建WordPress个人博客教程