最近新进一个公司,做的项目是手机支付系统。由于涉及到金钱相关的,所以安全性要求特别的高。项目分了很多个子系统,在部署(测试)的时候是每个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. [git]git project仓库迁移

    转自:https://segmentfault.com/q/1010000000124379 如果你想从别的 Git 托管服务那里复制一份源代码到新的 Git 托管服务器上的话,可以通过以下步骤来操作 ...

  2. 百度地图Api进阶教程-用户自定义数据(标记和搜索)7.html

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. thymeleaf 解析html时,出现 SAXParseException: The content of elements must consist of well-formed characte

    thymeleaf 解析html时,出现 SAXParseException: The content of elements must consist of well-formed characte ...

  4. jsp 引用css/js文件返回html网页问题

    我的问题: 我直接在web.xml中匹配了 “/” ,以为能默认使用 “localhost:8080/news/” 这种方式,直接进入首页. 但是这样会匹配所有url 因此请求的 ***.js/*** ...

  5. centos7配置kerberos服务,并使用JAAS登录

    准备两个虚拟机:192.168.1.101.192.168.1.102,101作为kerberos的server端,102作为kerberos的client端.开启88端口. 1.安装kerberos ...

  6. Windows安装Tomcat失败:Failed installing tomcat7 service

    今天在Win7下面安装tomcat(解压版),但是安装的时候老是弹出:Failed installing tomcat6 service.猜想是Win7安全权限管理的原因.网上搜了一下果然是这样. 解 ...

  7. Sword libcurl使用

    libcurl编译 >> ./configure --prefix=/opt/soft/curl --disable-ldap --disable-ldaps >> make ...

  8. Java 内部线程

    InsttoolCacheScheduler_ Worker-2 Quartz InsttoolCacheScheduler_Worker-2线程就是ThreadPool线程的一个简单实现,它主要负责 ...

  9. Windows IOT 开发入门(准备工作)

    终于抽出空来了,将最近研究的东西记录下来,物联网,万物皆可联网.然后可以做到智能家居,智能生活,智能城市....一大堆.吹牛的就不说了. 在实际应用中都是一个个小的传感器在收集数据,同时把数据直接或者 ...

  10. jsp页面利用JS做即时时间显示

    想给系统多些点缀,顺便把知识点温习一遍,不过讲真,这些都是网上扒的!我的水平现在也就这样 <%@page import="javax.xml.crypto.Data"%> ...