[工作bug]一个weblogic跨应用导致session丢失的bug之旅
近来,发布一个应用,开发和本地测试一切都好,一旦部署到测试环境之后,坑爹的问题随之而来,应用程序不定时的超时,导致用户正在操作过程中被踢了出来,纠结了几天,终于在今天将此问题搞定:
1、系统架构
系统采用nginx+weblogic进行部署,javaee项目,分为前台客户端和后台管理端。
2、应用程序排查
凡是遇到超时问题,首先想到的排查项目本身的设置问题。由于此问题出现不规律,可能1分钟就会超时,也可能十分钟,所以首先排除的也是此问题,但为了安全起见,还是找了下系统本身的设置。系统的超时时间设置在WEB-INF下的web.xml文件中,如下所示,确定设置为45分钟,没有问题。
<session-config>
<session-timeout></session-timeout>
</session-config>
3、用户机器自身缓存问题
在开发中,经常会遇到更新页面或者图片后,无法正确显示,于是都会去清理浏览器缓存。在清理完缓存后,会造成cookie的失效,于是需要用户重新登录,由于在本机开发未遇到此问题,所以才想用户是否在浏览器里设定了缓存失效时间。经过查询,浏览器并未禁用cookie,而且禁用cookie的现象应该是根本无法登陆才对,因此排除此种可能。
4、nginx问题
仔细询问测试人员,并将测试环境的weblogic端口直接开放给测试人员,测试人员测试后反馈,并未遇到超时情况,因此将问题锁定为nginx的超时时间配置,经过网上查询,nginx的配置与session相关的有如下配置:
client_header_timeout -头部超时时间
clinet_body_timeout -请求request bodyd超时时间
keepalive_timeout 连接保持时间
三个都不像是,但是keepalive_timeout还是有可能的,于是权当死马当活马医,将他设置为15分钟。提交测试人员,此时测试人员报告了个喜大普奔的消息,即使不通过nginx也会超时。于是彻底抓瞎了,但好歹排除了nginx的可能。
5、weblogic
再次想到的是weblogic的配置,但根据之前查询和工作的经验,从来没涉及到需要配置weblogic超时的时候,而且大家都明确说明,当weblogic和web.xml配置同时存在,以web.xml配置为准。
6、问题的解决
是在没有办法,只能自己一步一步的刷新前台页面,希望能发现点什么,但也没发现异常,这时候测试人员报了个后台bug,登录去处理,完成后重新去刷前台界面,发现前台已经超时。有点不敢相信,看了下时间,远没有到45分。于是尝试登录前台,正常,再登陆后台,发现前台超时。锁定此问题应该是两个应用之间缓存造成的。经过一番查询后,发现第一次访问前台应用时,cookie的值为jseesionId=A,但登录后台后,申请的变成了jseesionId=B,既然cookie都变了,登录信息肯定就丢失了。
为什么造成这个问题呢?原来session在服务器端生成后分配的sessionID在客户端的保存方式是个cookie,它的生命周期在浏览器关闭后就会结束,而这个cookie的名字如果不特别设置,weblogic会以默认的名称“JSESSIONID”来设置这个cookie的名称,所以访问同一个weblogic下的每个sever,都会使用同一个cookie。那么我们只能想办法来改变cookie的名称。经过查询,在WEB-INF下新增配置文件weblogic.xml文件,内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<session-descriptor>
<session-param>
<param-name>CookieName</param-name>
<param-value>ACookie</param-value>
</session-param>
</session-descriptor>
</weblogic-web-app>
,后台增加为BCookie,增加完成之后,在本地测试,发现没有效果,依旧还是JSESSIONID,怀疑没效果。后来想到可能是weblogic.xml配置文件只有发布到weblogic服务器才会生效。于是果断发布,发现cookie变为:
键 值
Cookie JSESSIONID=JnJyJ1gcqsyJygmQlZv7sMGQ9VsNLyTtfMLWTyKkjz2k25QJy4LX!536365765; ACookie=V5WxJ1fpmxrBkQ2pJzJx4YyJTGknjSjWw2wppvkF1vMM0THJvsnm!-1632860563; BCookie=LRhlJ1ybhNbqQPGhy94cSkysvjpShWSCyc8BVptfC8gYj127mqys!536365765
说明配置文件生效了,而且经过测试,不会出现超时问题。
7、疑问
本以为配置后每次访问仅有一个cookie对象,现在出现了三个,虽然解决了目前的问题,但是否会有新的问题,目前暂不知道。
[工作bug]一个weblogic跨应用导致session丢失的bug之旅的更多相关文章
- Spring Boot+AngularJS中因为跨域导致Session丢失
http://blog.csdn.net/dalangzhonghangxing/article/details/52446821 如果还在为跨域问题烦恼,请查看博主的 解决angular+sprin ...
- 获取登录验证码失败及前后端不同域导致session丢失问题分析记录
前言 前两周在把兄弟公司的几个服务部署到我们公司测试环境服务器的时候又遇到了不少问题,因为是前后端分离的项目,所以这次也同样遇到了跨域问题,解决方式也跟上一回的不一样,这里就再来分析记录一下. 登录验 ...
- Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)
1. InProc模式(默认值):asp.net将session保存到当前进程中,这种方式最快,但是不能多台服务器共享session,且会话状态数据容易丢失. <sessionState mod ...
- 五种情况会导致Session 丢失
1.Session到期自定丢失.2.当修改web.config 系统会重启 SESSION 会丢失.3.Bin目录有变化时候系统会重启 SESSION会丢失 (这里变化指的是,创建新文件.修改文件名 ...
- asp.net 修改/删除站内目录操作后会导致Session丢失
http://www.jb51.net/article/21770.htm http://blog.chinaunix.net/uid-7425507-id-134216.html 在Web项目中使用 ...
- 升级springboot 2.x 踩过的坑——跨域导致session问题
目前IT界主流前后端分离,但是在分离过程中一定会存在跨域的问题. 什么是跨域? 是指浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域. 做过web后台的童鞋都知道,跨 ...
- php 页面调转导致session丢失解决方法
例如在a页面设置了会话,然后打印会话值,可以成功打印,但是调转到b页面后,会话丢失了. 原因有不少,一个原因就是没有在页面开头加入session_start();当然你也可以直接配置php.ini文件 ...
- 解决getJSON跨域登录Session丢失的问题
最近在做项目中发现,我用下面的代码异步请求到login.ashx: var memberUrl = rooturl + 'member.ashx?r=' + Math.random() + '& ...
- IE跨Iframe时Session丢失问题
例如IIS下,可以打开IIS窗口——〉选择一个网站——〉属性——〉http头,增加一个http头 然后输入头名:P3P 输入头内容:CP=CAO PSA OUR 点评:与上一个方法类似,此方法也要求第 ...
随机推荐
- 1.SQL语句入门
--SQL语句入门-- --1.sql语言是解释语言 --2.它不区分大小写 --3.没有"",所有字符或者字符串都使用''包含 --4.sql里面也有类似于c#的运算符 -- 算 ...
- 【编程题目】有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配...
37.(字符串)有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前 m 个字符匹配,则两个字符串可以联接,问这 n 个字符串最多可以连成一个多长的字符串,如果出现循环, ...
- 在iOS 应用中直接跳转到appstore的方法
找到应用程序的描述链接,比如:http://itunes.apple.com/gb/app/yi-dong-cai-bian/id391945719?mt=8 然后将 http:// 替换为 itms ...
- ibatis中使用like模糊查询
select * from table1 where name like '%#name#%' 两种有效的方法: 1) 使用$代替#.此种方法就是去掉了类型检查,使用字符串连接,不过可能会有sql注入 ...
- IOS-Gesture(手势识别)
手势识别——Gesture Recognizer •iOS3.2版本之后,苹果推出了手势识别(Gesture Recognizer),其目的是: –简化开发者的开发难度 –统一用户体验 • •iOS目 ...
- [Android Pro] Android 官方推荐 : DialogFragment 创建对话框
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37815413 1. 概述 DialogFragment在android 3.0时 ...
- 晨跑(bzoj 1877)
Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个十 ...
- Qt5_简易画板_详细注释
代码下载链接: http://pan.baidu.com/s/1hsc41Ek 密码: 5hdg 显示效果如下: 代码附有详细注释(代码如下) /*** * 先新建QMainWindow, 项目名称 ...
- python基础——错误处理
python基础——错误处理 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数 ...
- Android错误:Re-installation failed due to different application signatures
Re-installation failed due to different application signatures (2013-04-20 14:27:32) 转载▼ 标签: 解决方法 问题 ...