跨域、跨服务器调用时候session丢失的问题总结!!!

简介:

跨域、跨服务器调用时候session丢失的问题总结!!!

这篇文档是最近一次工作中遇到问题的总结,且听我娓娓道来:(可能有很多地方不对,我只是这样想通拉。)

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

原文地址http://www.bieryun.com/2086.html

相关文章
|
6月前
|
弹性计算 前端开发 网络安全
云服务器 ECS产品使用问题之遇到报错“failed to create session manager connector for”,该怎么办
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
5月前
|
前端开发 应用服务中间件 API
"揭秘!面试官必问:你是如何巧妙绕过跨域难题的?前端代理VS服务器端CORS,哪个才是你的秘密武器?"
【8月更文挑战第21天】在软件开发中,尤其前后端分离架构下,跨域资源共享(CORS)是常见的挑战。主要解决方案有两种:一是服务器端配置CORS策略,通过设置响应头控制跨域访问权限,无需改动前端代码,增强安全性;二是前端代理转发,如使用Nginx或Webpack DevServer在开发环境中转发请求绕过同源策略,简化开发流程但不适用于生产环境。生产环境下应采用服务器端CORS策略以确保安全稳定。
69 0
|
7月前
|
JSON JavaScript 数据格式
详细解读CococCreator跨域访问资源服务器
详细解读CococCreator跨域访问资源服务器
96 0
|
8月前
|
JavaScript API
本地开发环境请求服务器接口跨域的问题(vue的问题)
本地开发环境请求服务器接口跨域的问题(vue的问题)
624 1
|
8月前
|
JavaScript API
解决Vue项目请求接口跨域的问题,配置Vue项目index.js代理请求服务器端接口
解决Vue项目请求接口跨域的问题,配置Vue项目index.js代理请求服务器端接口
解决Vue项目请求接口跨域的问题,配置Vue项目index.js代理请求服务器端接口
|
应用服务中间件 nginx
记录一次艰难的云服务器部署前后端项目springBoot+mybatis+vue(两天解决的前后端跨域问题多种方式)...
记录一次艰难的云服务器部署前后端项目springBoot+mybatis+vue(两天解决的前后端跨域问题多种方式)...
135 0
|
前端开发 JavaScript Java
【React工作记录九十八】记录一次艰难的云服务器部署前后端项目springBoot+mybatis+vue(两天解决的前后端跨域问题多种方式)...
【React工作记录九十八】记录一次艰难的云服务器部署前后端项目springBoot+mybatis+vue(两天解决的前后端跨域问题多种方式)...
153 0
|
前端开发 应用服务中间件 nginx
【React工作记录九十八】记录一次艰难的云服务器部署前后端项目springBoot+mybatis+vue(两天解决的前后端跨域问题多种方式)...
【React工作记录九十八】记录一次艰难的云服务器部署前后端项目springBoot+mybatis+vue(两天解决的前后端跨域问题多种方式)...
78 0
|
前端开发 JavaScript Java
记录一次艰难的云服务器部署前后端项目springBoot+mybatis+vue(两天解决的前后端跨域问题多种方式)...
记录一次艰难的云服务器部署前后端项目springBoot+mybatis+vue(两天解决的前后端跨域问题多种方式)...
405 0
|
存储 C# 数据库
Qt+QtWebApp开发笔记(四):http服务器使用Session和Cookie实现用户密码登录和注销功能
前面实现了基础的跳转,那么动态交互中登录是常用功能。本篇实现一个动态交互的简单登录和注销功能,在Qt中使用Session和Cookie技术。

热门文章

最新文章