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

  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】Regular Expression Matching (hard) ★

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  2. 【leetcode】Remove Nth Node From End of List(easy)

    Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...

  3. 真机测试无缘无故finish了。程序也没有启动

    去钥匙串里边把多余的证书删除, 然后reset xcode - preference - 选中你的appleID - iOS Development  -  reset

  4. MongoDB配置文件YAML-based选项全解

    配置文件部分 MongoDB引入一个YAML-based格式的配置文件.2.4版本以前的仍然兼容. 我的mongodb配置文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  5. ASP.NET Global 全局事件处理

    添加Global文件,名字不要改 Global类说明: using System; using System.Collections.Generic; using System.IO; using S ...

  6. Rabbitmq实现负载均衡与消息持久化

      Rabbitmq 是对AMQP协议的一种实现.使用范围也比较广泛,主要用于消息异步通讯. 一,默认情况下Rabbitmq使用轮询(round-robin)方式转发消息.为了较好实现负载,可以在消息 ...

  7. JS返回上一页

    <button  onclick="javascript:history.go(-1);">返回上一页</button> <button  oncli ...

  8. 关于快捷键 Ctrl+Alt+[方向键] 的知识

    在用PS作图时使用 Ctrl+Alt+[方向键]  组合建时屏幕莫名翻转, 平时电脑懒得维护所以略卡,我不会说一般早上起床摁了开机去上完厕所回来还--咳咳 刚按下时瞬间一黑,再黑,,继续黑--真是大吃 ...

  9. 1.2 容器-container

    1) *  容器是用于存放数据的类模板,实例化后就是容器类.用容器定义的对象称为容器对象. **类型相同的容器可以进行比较运算 2)分类 容器可分为顺序容器和关联容器两大类. *:顺序容器 元素的位置 ...

  10. 二、JavaScript语言--JS实践--倒计时效果

    主要内容:分析不同倒计时效果的计算思路及方法,掌握日期对象Date,获取时间的方法,计算时差的方法,实现不同的倒时计效果. Javascript 日期对象: Date()返回当前的日期和时间 getY ...