最近新进一个公司,做的项目是手机支付系统。由于涉及到金钱相关的,所以安全性要求特别的高。项目分了很多个子系统,在部署(测试)的时候是每个Tomcat上面只放一个子系统。比如现在有5个子系统,那么就会对应5个Tomcat启动了放在linux上面的。为什么这么做?试想如果在上线以后,如果其中一个系统有问题要重启服务器,5个子系统都放在一起的话,那不是全部都会跟着重启了!现在说说我们遇到的问题了。

用户登录后,在管理子系统,有一个充值连接,会跳到充值子系统去充值。这样跨JVM的跳转只能用redirect来跳,但是用户自己的登录状态就会丢失了(登录session丢失)。后来改为forward跳转到自己的jsp页面,然后在form提交到充值子系统去充值。在本地开发测试的时候session是不会丢失的,但是发布到linux下面的Tomcat就会丢失。找了各种原因都以为是操作系统差异的问题。

后来发现一个这样的区别,开发测试是两个IP不同的端口号的跳转,发布到linux上面测试是同一个IP不同的端口号的跳转。这样涉及到对浏览器session和cookies的了解程度拉。

首先session是存放在容器里面的,而且一次会话的session会生成一个jsessionid,在管理session的时候是根据jsessionid去寻找,能找到就不会创建新的session,找不到才创建新的session,确定这才是一次新的会话。而cookies是存放在客户端的文件。jsessionid也会放到cookies里面。

两个IP、两个端口就会有两个session、两个cookies这样session是会丢失的。首先在管理子系统第一次登录会生成一个jsessionid,在一个cookies里面去是找不到这个session的。就会创建登录成功的session。然后跳转到充值子系统,也会在充值子系统生成一个jsessionid,到另一个cookies里面去找这个session也是找不到的,也会创建一个session。以前的session就这样丢失拉。

一个IP、两个端口就会有两个session、一个cookies这样session也是会丢失的。首先在管理子系统第一次登录会生成一个jsessionid,在cookies里面去是找不到这个session的。就会创建登录成功的session。然后跳转到充值子系统,也会在充值子系统生成一个jsessionid,到同样这个cookies里面去找这个session也是找不到的,也会创建一个session覆盖以前的session。

解决把法就是不让jsessionid自动生成,放到cookies里面。而是在url里面传递jsessionid,不用靠cookies。说通俗点这个就叫url重写。

这样在管理系统第一次登录会生成一个jsessionid,创建登录session。当到充值系统的时候我会把jsessionid传过去那边也会生成一个session。意思就是两个容器各自生成了各自的session,但是共用的同一个jsessionid。这样每次到容器里面去取session内容都是根据同一个jsessionid去取,如果创建过的话。里面肯定是能拿到的。但是里面的内容各自创建的又不一样。这样session就不会丢失老!!!

要让url重写有很多方法,比如:

<c:url value=""/>

response.encodeRedirectUrl("");
response.encodeUrl("");

等多种方法。但要让cookies里面的jsessionid不被使用就需要浏览器完全禁用cookies等。还有个简单的方法就是在Tomcat里面配置:

tomcat_home/conf/context.xml里面把<Context>改为<Context cookies = "false">这样就好拉!!!

然后url就会自动变成这个样子:

http://127.0.0.1:8080/login.do;jsessionid=66B0A8E2B78940C7B1BB16ABB8E0D3E9?method=toLogin

跨域、跨服务器调用时候session丢失的问题的更多相关文章

  1. 通过Html5的postMessage和onMessage方法实现跨域跨文档请求访问

    在项目中有应用到不同的子项目,通过不同的二级域名实现相互调用功能.其中一个功能是将播放器作为单独的二级域名的请求接口,其他项目必须根据该二级域名调用播放器.最近需要实现视频播放完毕后的事件触发,调用父 ...

  2. 第三节:SignalR之PersistentConnection模型详解(步骤、用法、分组、跨域、第三方调用)

    一. 承上声明 在上一个章节里,啰里啰嗦写了一堆关于介绍SignalR的“废话”,从这一篇开始往后正式撸代码,这期间不少人(包括 张善友大哥)建议我直接用.Net Core下的SignalR,关于此简 ...

  3. IE下IFrame引用跨域站点页面时,Session失效问题解决

    问题场景:在一个应用(集团门户)的某个page中, 通过IFrame的方式嵌入另一个应用(集团实时监管系统)的某个页面. 当两个应用的domain 不一样时, 在被嵌入的页面中Session失效.(s ...

  4. vue 跨域请求,后端cookie session取不到

    虽然后端设置了可以跨域请求,但是后台设置到cookie中的session取不到!这时候mac电脑自己设置nginx代理! mac电脑系统重装了,记录一下安装nginx的过程: 1.打开终端(cmd) ...

  5. Ajax跨域Post方法调用Web Api(NuGet配置的环境)

    没安装的去NuGet安装, 然后安装, 建立Web Api项目.需要在里的WebApiConfig.cs里配置 config.EnableSystemDiagnosticsTracing(); //感 ...

  6. html5的postmessage实现js前端跨域訪问及调用解决方式

    关于跨域訪问.使用JSONP的方法.我前面已经demo过了.详细见http://supercharles888.blog.51cto.com/609344/856886,HTML5提供了一个很强大的A ...

  7. node解决跨域和服务器代理详解代码

    node中有很多解决服务器代理的插件,这里简介一个:express-http-proxy 之前网上查的使用node解决跨域的插件,有很多,例如,cors,koa2,这里解决跨域问题我拿原生解决的,ex ...

  8. HTMLajax跨域向服务器写入数据

    1.XMLHttpRequest升级版已经实现了跨域请求.不过需要在后台设置:header("Access-Control-Allow-Origin:http://www.a.com&quo ...

  9. 跨域跨域跨域,从此say goodbye

    跨域这个问题每个开发者都会遇到,只是时间先后而已,你不搞清楚它他就像狗皮膏药一样粘着你,在你求职生涯中不停的遇到,然后你每次都要做这个功课,终于有一天这个名词已经让我忍无可忍了,下定决心必须搞定它,要 ...

随机推荐

  1. 手写体识别中用到的Tensorflow函数复习

    tf.truncated_normal(shape, stddev=0.1) 从截断的正态分布中输出随机值. 生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢 ...

  2. Redis集群方案<转>

    为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在 ...

  3. Android—— Fragment 真正的完全解析(上)(转)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37970961 自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fra ...

  4. centos下软件安装

    1. vim安装 yum -y install vim*

  5. js 的数值限制可能引起的问题

    源于:https://raw.github.com/ruanyf/jstutorial/gh-pages/grammar/number.md 1. 根据国际标准IEEE 754,64位浮点数格式的64 ...

  6. java json转换

    https://blog.csdn.net/WillJGL/article/details/77866224 SpringBoot中如果需要实现json的序列化和反序列化,我们会使用json解析工具. ...

  7. node学习笔记9——cookie,session相关操作

    下面讲的都是基Express及相关的包.所以在实践本篇文章之前,通过npm安装好Express, cookie-parser, cookie-session这三个安装包. 先简单说一下,如何用Expr ...

  8. R语言-连接MySQL数据库方法

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   R语言连接数据库常用的方法有2种: 1.使用R数据库接口 连接MySQL,使用RMySQL包,使用前RMySQL包要先安 ...

  9. 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器

    对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...

  10. mysql查询常用小语句

    mysql  查询某个库里表的数量 在mysql中有个数据库information_schema下的表tables记录了所有数据库中所有的表相关信息 TABLE_SCHEMA 数据库名称 SELECT ...