关于Websphere 会话管理若干奇葩问题

引言

      由于最近在做应用集成平台,即实现独立部署的WAR包可以在同一个集成平台中访问。被集成的业务组件为什么可以在集成平台实现页面集成,主要通过以下几个步骤实现:

  ①用户登录集成平台系统;
  ②集成平台加载业务组件菜单,业务组件菜单的URL自动添加一个会话凭据,即会话token。这样点击这个组件菜单,将向独立部署的业务组件服务发送页面请求;
  ③这个页面请求被安装在业务组件中的集成插件(其实是一个HttpFilter)截获,并执行以下操作:
     1)集成插件通过向集成平台发送REST请求验证token的合法性,如果不合法将请求重定向
      到集成平台的登录页面,否则执行下一步操作;
     2)根据token再次发送REST请求,获取对应的会话用户信息(如用户名,所有单位等)。
  ④根据远程获取的用户会话信息产生业务组件本地的会话(即本地的HttpSession),创建本地会话后,即可正常打开被集成到集成平台的业务组件菜单页面了。

     图1 平台集成结构图

    由于集成平台提供的验证token合法性、根据token获取会话用户信息等Rest服务都是工作于会话环境下,因此我的设计是token即取自会话的ID(即HttpSession.getId()),换句话说,token即是会话的ID。在集成插件中,通过发送如下的Rest请求调用集成平台的Web Service:

 

   http://<集成平台url>;jsessionid=<token>?xxx=yyy...


    以下是通过URL传递会话的标准写法,在Jetty,Tomcat等应用服务器下,集成平台都可为请求正确绑定HttpSession,但是在WebSphere下却不行,为了解决该问题花了我两天多时间,下面就回顾一下解决这个问题的整体过程。

Websphere默认未开启URL会话重写

    我们都知道维护客户端和服务端会话有两种实现方式,其一是通过URL会话重写,即上面所列的URL后加“;jsessionid=xxx”的方式,另一种是通过Cookie,在产生会话时,应用服务器向客户端Cookie中写一个名为JSESSIONID的会话ID,客户端每次请求时都将Cookie带上来,以下是一个会话Cookie的报文:

图 2 Cookie会话ID

     Jetty,Tomcat等应用服务器默认两种方式都支持,但是WebSphere默认只支持Cookie维护会话的方式,如果需要支持URL会话重写的方式,需要手工启用这个功能并重启应用服务器:


图 3 WebSphere启用URL重写

    由于我的集成插件默认是以添加";jsessionid=xxx"来维护会话的,由于WebSphere默认未开启URL会话重写,我又不希望对应用服务器的配置提出额外的要求,
因此决定放弃URL重写方式,统一采用Cookie维护会话。因此集成插件做了如下的调整:
    

public String doGet(String url, String token) {
       CloseableHttpResponse response = null;  
      try {  
          if (logger.isDebugEnabled()) {
            String message = MessageFormat.format("doGet[request]:\n[{0}]", url); 
             logger.debug(message);
           }
           HttpGet httpGet = new HttpGet(url);
           httpGet.addHeader(new BasicHeader("Cookie", "JSESSIONID=" + token));//==>①这儿通过Cookie上传会话ID
            httpGet.setConfig(requestConfig);

            response = httpClient.execute(httpGet);
            HttpEntity entity = response.getEntity();
            String result = EntityUtils.toString(entity, Consts.UTF_8); 
            if (logger.isDebugEnabled()) {
            String message = MessageFormat.format("doGet[response]:\n[{0}]", result); 
            logger.debug(message);
        }  
        return result;
    } catch (IOException e) {  
       logger.error("doGet error", e);  
       throw new RuntimeException(e);
    } finally {  
       try {  
           if (response != null) {
                response.close();
            }
        } catch (IOException e) {  
            logger.error("doGet error", e); throw new RuntimeException(e);
        }
    }
}

      本以为这样就可以万事大吉了,可是还是使用Jetty,Tomcat运行集成平台时都是正常的,但是使用WebSphere时还是外甥打灯笼--照旧,依然顽强地一点击被集成组件菜单就弹出到集成平台的登录页面。

Websphere奇葩的会话ID     

     一般应用服务器通过HttpSession.getId()获取的ID和其自动被Cookie中写的JSESSIONID是一致的,可是WebSphere毕竟不是常人,它非常有个性的两者不一致。也就是说你在服务器获取的会话ID和它写到客户端的会话ID是不一致的,而且如果你手工将服务端获取的会话ID放到Cookie中的JSESSIONID中时,服务端无法找到对应的会话!!!!!,我不想让人说我诬陷IBM,有图为证:


图4 WebSphere Cookie的会话ID和服务端获取不一致

    且不说 WebSphere往Cookie中写的一大坨内容究竟有没有必要(tomcat,jetty的cookie都是清清爽爽的),它往Cookie中写的会话ID不是服务器端
通过HttpSession.getId()获取的会话ID,而是头尾都加了东西:头部添加了“0000”,尾部添加了:19vrbkigt(不知道啥用途)!
如果要通过Cookie维护
会话,一定要学WebSphere在会话ID前添加“0000”,否则请求发上去就找不到对应的会话了。

       由于Jetty的会话ID为12位,Tomcat的会话32位,而webSphere的会话ID(服务端的)23位,所以我就根据会话ID长度来识别是哪咱类型应用服务器的会话ID
,如果是websphere的就在前面添加0000,代码如下:

 

/**  
* 对{@code token}进行处理:  
* <pre> 
*     1.was 的token前面需要添加0000:xxx=>0000xxx  
*     2.jetty,tomcat,等其它应用服务器直接返回原值.  
*     注意:was的token为23位,jetty及tomcat的token分别为12及32位.  
* </pre> 
* @param token * @return */ 

private static final String getNormToken(String token) {  
 if (token != null && token.length() == 23) { 

    return "0000"+token;
  }else{ 

     return token;
  }
}


小结
      

 

     WebSphere不死,程序灾难未平!

分布式应用session会话管理-基于redis session会话在单台服务器下不会出现共享问题,现在应用部署方式都是分布式,或者集群部署,这样必然会面临一个问题,session共享。 session共享的解决方案也有很多, 一、web服务器的粘性请求,比如采用nginx请求分发,使用ip_hash这种负载均衡方式,客户端请求只会被分发到相同的后台server,这样可以避免session共享的问题。但是缺点也很明显 二、基 阅读详情

相关推荐

was集群session共享设置

在was集群中,通常需要设置session共享,按照文档步骤可以完成session共享设置,解决你应用中的问题

IBM Websphere 集群会话共享问题解决办法

遇到一应用部署环境如下图: 两台HTTP SERVER(以下简称IHS)负责转发数据包,其中F5采用粘性模式,即一个用户在会话周期内的数据包一定会被转发到IHS中的一台, 但IHS 到Web Server之间的服务器选择确是随机分发的,导致请求会话无法保持,由于部署的为管理类系统,SESSION的保持是必须的。 WebSphere 有两种解决办法: 1. 全部WebSphere ...

weixin_33753003的博客 1180

WAS会话设置 Websphere

快捷设置Websphere的超时问题,永久会话的设置问题统统解决!

安全03-修改WAS配置解决请求头中缺少httponly、secure字段问题

安全问题描述 1.用HttpOnly属性可能导致 Cookie被窃取。窃取的Cookie可以包含标识站点用户的敏感信息,攻击者可以重放窃取的Cookie,以便伪装成用户或获取敏感信息 2.secure属性设置为Flase时,Cookie存在被窃听的风险 问题如下图所示 修复方案 1.Cookie中加上HttpOnly标识,以下网址为详细介绍Cookie中的HttpOnly标识:https://msdn.microsoft.com/zh-cn/library/system.web.httpcookie.ht

windows_apple的博客 1252

STM32F4驱动ADS1220高精度ADC:从SPI配置到数据校准的完整实战指南

本文详细介绍了如何使用STM32F4微控制器驱动ADS1220高精度ADC,涵盖从SPI接口配置、寄存器设置到数据采集与校准的全过程。通过实战代码示例和硬件设计要点,帮助开发者快速构建高精度数据采集系统,适用于工业测量和精密仪器等应用场景。

weixin_26918763的博客 224

SAP成本控制范围配置全流程:从货币参数到标准层次(附2024最新SPRO路径)

本文详细拆解了SAP成本控制范围(Controlling Area)的完整配置流程,涵盖从货币与估价参数文件定义、参数文件分配到控制范围,再到成本中心标准层次创建等核心步骤。文章提供了2024年最新的SPRO导航路径和实战配置要点,帮助顾问构建稳健、可扩展的管理会计基础架构,并附有常见问题排查指南。

java5的博客 939

WEB应用程序状态管理

作用:实现请求响应过程结束后,WEB服务器记得用户曾经做过的请求,和发出过的响应,甚至跨多个请求保留信息; 解决办法:如何保存用户的登录状态信息;cookies、Session、URL重写、隐藏表单bidden; 一、表单的隐藏字段: 使用场景: 1.1对用户在网站上的访问进行会话跟踪; 1.2为服务器端程序提供预定义的输入 1.3存储动态产生的页面上下

Munger6的博客 797

Latex参考文献中大写字母编译后自动变成了小写,如何保持原字母大写形式

bib文件参考文献中大写自动变为小写,如何保持原大写问题。Latex: 保持参考文献大小写,overleaf文献编译后,原大写字母自动变成了小写字母,如何保持原字母大写

我的个人博客 5805

nodejs学习(五)token验证踩坑

node token验证踩坑

qq_43610311的博客 3555

别再算错了!深入SAP FI后台,看懂外币清账时汇兑损益的自动计算逻辑

刚接手一家跨国企业的SAP财务模块优化项目时,我遇到了一个棘手案例:每月末外币清账产生的汇兑损益金额总是与财务团队的预期存在差异。最令人困惑的是,系统似乎"擅自"计算出了1989.11元的损益,而财务人员反复手工验算都无法复现这个数字。这让我意识到,要真正掌握SAP FI的外币处理能力,必须深入理解系统后台的汇兑损益计算逻辑——不是停留在操作层面,而是穿透到算法内核。这个过程的精妙之处在于,损益金额不是简单比较两个时点的市场汇率,而是反映业务执行全周期的汇率影响。:损益金额与手工计算不符。

weixin_32932149的博客 473

逆变器并联--下垂控制引入虚拟阻抗

说明传统下垂控制的缺点、分析虚拟阻抗的原理和实现方法

weixin_58670090的博客 1万+

was的session管理

java web项目业务需求是修改session时效性,来控制登录网上说是有三,四种办法 1改节点的会话时间(控制台) 2改项目的会话时间(控制台)  3改web.xml    4改代码我想说直接改代码就是setMaxInactiveInterval()方法,前面三个方法怎么改都没有效果,可能和我的安装环境有关,花了一天多时间怀疑客户端session断了后台没销毁,怀疑这个原因,怀疑那个原因,浪费...

sinat_38831242的博客 2597

可维护的 SAP UI5 Theming 策略:从 CSS 级联与特性选择器到 UI Theme Designer 的工程化落地

摘要:SAP UI5主题化是一个涉及CSS级联、选择器特异性和主题参数的系统工程,与应用逻辑解耦以实现品牌化和无障碍适配。轻量级调整优先使用附加CSS,重大改动才考虑创建新主题。样式冲突需通过特异性原则解决,避免滥用!important。动态添加样式应使用addStyleClass而非直接操作DOM。主题可通过bootstrap参数、URL或运行时API设置,企业级主题推荐使用UI Theme Designer。自定义内容应消费主题变量以实现一致性,避免直接修改控件内部结构或内联样式。工程化落地需规范分层和

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 307

WAS优化之集群会话分布式设置举例

下面对was集群环境下的分布式会话设置做一个简单的操作举例。找到应用服务器,如下: 先点击进入其中一个节点,如下: 选择“分布式环境设置”,如下: 初次设置时,需要进行新建后,选择“内存到内存复制”,如下: 然后完成常规属性配置,可参考如下: 点击确定后,完成节点间配置同步,该节点的会话分布式设置就完成了。同理,另外一个节点进行相同的操作即可。小知识点,简而记之。蓝的成

深蓝@黄炎龙 3410

微信小程序 - 详解苹果ios手机请求不到数据访问不了接口,但安卓却可以正常访问。wx.request苹果手机IOS请求失败、安卓可以请求成功(微信小程序上线后苹果手机不能访问接口,网络请求失败排查)

微信小程序上线后,苹果手机请求不到数据,安卓可以,微信小程序,安卓可以调接口,苹果调不了的解决方案,微信小程序:IOS访问不了接口,安卓可以正常访问,微信小程序ios版本连接不了服务器,小程序Android可以请求,ios请求失败wx.request,成功上线的小程序,安卓机可以正常访问使用,苹果微信小程序不执行请求,苹果系统无法加载数据,微信小程序 iOS 网络失败,微信小程序接口请求在ios端报错,苹果手机真机调试微信小程序出现网络请求失败,微信小程序 安卓正常 ios调接口显示网络请求失败,微信小程序

🏆 前端领域优质创作者 4361

【毫米波混合波束成形】第3章 深度展开网络:将迭代优化嵌入计算图

相位提取算子 $P_\phi: \mathbb{C}^N \to \mathbb{C}^N$ 定义为逐元素相位归一化 $P_\phi(z) = \exp(j \cdot \angle z)$。该算子在复数域非全纯(Non-holomorphic),标准反向传播需扩展至Wirtinger微积分框架。对于复数变量 $z = x + jy$,Wirtinger导数定义:相位提取算子的Jacobian矩阵在极坐标下具有稀疏结构。

VectorShift的博客 406

websphere 8.5.5.12 JSESSIONID 长度

解决方法  : cookie 名 随便改一个    然后保存    然后重启 websphere   . windows 关闭 websphere 方法,实在没有效果 重启电脑 websphere 进程 websphere 监听的是8880端口, 一个server占用300M的内存。 1。查看进程号 >netstat -aon | findstr "8880"

1823

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Unrecognized token 'xxxx': was expecting ('true', 'false' or 'null')

$.ajax({ type:"post", url: "xxx", data:{"a":123,"b":456}, dataType: "json", contentType : "application/json", success:function(result)

u013868665的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WebSphere6.x中不能使用Spring的session scope注入对象的解决办

原来一直使用spring的aop去注入一些Session scope的对象,但是今天在部署此类应用程序的时候却出现了以下异常:[09-12-25 14:50:52:562 CST] 0000003f WebApp        E   SRVE0026E: [Servlet ERROR]-[Filter [IdentityFilter]: filter is unavailable.]:o

kongxx的专栏 3706

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

websphere服务二:websphere字符集修改

websphere字符集修改

xiao.yu的博客 5006

was节点不同步解决方法

Was控制台节点显示同步状态不正常,无法完成同步,问题解决如下: 一、 切换到bin目录下,执行相应命令,依次停止 server 、 node 、dmgr(严格按照此顺序) /opt/IBM/WebSphere/AppServer/profiles/AppSrv02/bin/stopServer.sh  server1 --servername /opt/IBM/WebSphere/App

若水专栏 7376
上一篇: 几种常用的REST webservice客户端测试工具
下一篇: 一个批处理文件N个知识点
quickselect
博客等级 码龄20年 1粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值