[工作bug]一个weblogic跨应用导致session丢失的bug之旅

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

  1、系统架构

  系统采用nginx+weblogic进行部署,javaee项目,分为前台客户端和后台管理端。

  2、应用程序排查

  凡是遇到超时问题,首先想到的排查项目本身的设置问题。由于此问题出现不规律,可能1分钟就会超时,也可能十分钟,所以首先排除的也是此问题,但为了安全起见,还是找了下系统本身的设置。系统的超时时间设置在WEB-INF下的web.xml文件中,如下所示,确定设置为45分钟,没有问题。  

<session-config>   
    <session-timeout>45</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对象,现在出现了三个,虽然解决了目前的问题,但是否会有新的问题,目前暂不知道。

posted @ 2015-03-03 16:33  孤子  阅读(1966)  评论(0编辑  收藏  举报