近来,发布一个应用,开发和本地测试一切都好,一旦部署到测试环境之后,坑爹的问题随之而来,应用程序不定时的超时,导致用户正在操作过程中被踢了出来,纠结了几天,终于在今天将此问题搞定:

  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之旅的更多相关文章

  1. Spring Boot+AngularJS中因为跨域导致Session丢失

    http://blog.csdn.net/dalangzhonghangxing/article/details/52446821 如果还在为跨域问题烦恼,请查看博主的 解决angular+sprin ...

  2. 获取登录验证码失败及前后端不同域导致session丢失问题分析记录

    前言 前两周在把兄弟公司的几个服务部署到我们公司测试环境服务器的时候又遇到了不少问题,因为是前后端分离的项目,所以这次也同样遇到了跨域问题,解决方式也跟上一回的不一样,这里就再来分析记录一下. 登录验 ...

  3. Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)

    1. InProc模式(默认值):asp.net将session保存到当前进程中,这种方式最快,但是不能多台服务器共享session,且会话状态数据容易丢失. <sessionState mod ...

  4. 五种情况会导致Session 丢失

    1.Session到期自定丢失.2.当修改web.config 系统会重启  SESSION 会丢失.3.Bin目录有变化时候系统会重启 SESSION会丢失 (这里变化指的是,创建新文件.修改文件名 ...

  5. asp.net 修改/删除站内目录操作后会导致Session丢失

    http://www.jb51.net/article/21770.htm http://blog.chinaunix.net/uid-7425507-id-134216.html 在Web项目中使用 ...

  6. 升级springboot 2.x 踩过的坑——跨域导致session问题

    目前IT界主流前后端分离,但是在分离过程中一定会存在跨域的问题. 什么是跨域? 是指浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域. 做过web后台的童鞋都知道,跨 ...

  7. php 页面调转导致session丢失解决方法

    例如在a页面设置了会话,然后打印会话值,可以成功打印,但是调转到b页面后,会话丢失了. 原因有不少,一个原因就是没有在页面开头加入session_start();当然你也可以直接配置php.ini文件 ...

  8. 解决getJSON跨域登录Session丢失的问题

    最近在做项目中发现,我用下面的代码异步请求到login.ashx: var memberUrl = rooturl + 'member.ashx?r=' + Math.random() + '& ...

  9. IE跨Iframe时Session丢失问题

    例如IIS下,可以打开IIS窗口——〉选择一个网站——〉属性——〉http头,增加一个http头 然后输入头名:P3P 输入头内容:CP=CAO PSA OUR 点评:与上一个方法类似,此方法也要求第 ...

随机推荐

  1. WebFrom 的js日期控件

    1.WdatePicker.js /* * My97 DatePicker 4.7 Release * License: http://www.my97.net/dp/license.asp */ v ...

  2. os.walk()

    os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. walk()方法语法格式如下: os.walk(top[, topdown=True[, onerror=None[ ...

  3. [Android Pro] 将你的安卓手机屏幕共享到PC或Mac上

    有时候为了方便演示一个手机app,需要把手机屏幕显示到PC或Mac上.这里提供一个方法 — 使用Vysor达到此功能. Vysor的吸引力在于3个方面: 它适用于Windows.Linux或Mac. ...

  4. NYOJ题目101两点距离

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsEAAAIBCAIAAAAnO/WXAAAgAElEQVR4nO3dq3IbSeM34L0Jc/O9BW

  5. AJAX JSON类型返回

    文本样式和下拉样式 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  6. c++11中的static

    超赞的线程安全的初始化 static plsa::PLSAModel& model() { static plsa::PLSAModel _model = ([&]() { plsa: ...

  7. wifi基础知识整理

    转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...

  8. Pyqt 一个简单的浏览器

    使用QtWebKit 做一个简单的浏览器. mybrowserUI.ui <?xml version="1.0" encoding="UTF-8"?> ...

  9. 7z命令行工具

    7z (中文)是优秀开源的压缩解压缩软件(wiki: en  中文),有windows版本与linux版本,最新的9.32版本支持的格式包括: 压缩与解压缩均支持:7z, XZ, BZIP2, GZI ...

  10. gcc参数-l传递顺序错误导致`undefined reference'的一点小结

    刚才编译一个pthread的单文件程序, 使用的命令行是: gcc -o thread1 -lpthread thread1.c 结果报错: $ gcc -o thread1 -lpthread th ...