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

  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. 【leetcode】Partition List(middle)

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  2. 【leetcode】Kth Largest Element in an Array (middle)☆

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  3. powerdesigner新建模型教程

    1.现在开始使用PowerDesigner创建数据库,首先运行程序,进入主界面:

  4. CentOS 7.0 部署 Django 到运行起来第一个web service

    最近在学习Python,今天发现Django如此强大的web框架,不得不来试一试. 1. 安装Python,官网建议用Python3:

  5. [Android] 解析android framework下利用app_process来调用java写的命令及示例

    reference to :http://bbs.9ria.com/thread-253058-1-1.html 在android SDK的framework/base/cmds目录下了,有不少目录, ...

  6. 借助LinkedHashMap实现基于LRU算法缓存

    一.LRU算法介绍 LRU(Least Recently Used)最近最少使用算法,是用在操作系统中的页面置换算法,因为内存空间是有限的,不可能把所有东西都放进来,所以就必须要有所取舍,我们应该把什 ...

  7. Java集合源码学习(二)ArrayList分析

    >>关于ArrayList ArrayList直接继承AbstractList,实现了List. RandomAccess.Cloneable.Serializable接口,为什么叫&qu ...

  8. 【jquery】幻灯片效果

    闲着无聊,用Jquery写了一个幻灯片效果. 我这人喜欢造轮子,除了jquery这种有强大开发团队的框架级别JS,其实的一些小程序都是尽量自己写. 一是因为怕出问题了没人问,二是自己写的改起来也方便. ...

  9. 玩玩Excel下的Power View

    作为微软平台下的数据展示工具,Power View是一个不错的选择.而在Excel 2013下,即使你没有SharePoint的实例那么你也可以玩转它.此篇讲对Excel 2013下的Power Vi ...

  10. [译] EXTENDING JQUERY – 2.2 A simple plugin

    2.2 一个简单的插件示例 jQuery 插件能做任何事情,这个已经由浩如烟海的各类第三方插件如证明.小到只影响一个元素,大到改变多个元素的外观和行为,jQuery 的各种功能等你来扩展. 2.2.1 ...