`

关于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不死,程序灾难未平!

分享到:
评论

相关推荐

    WAS会话设置 Websphere

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

    使用WebSphere MQ管理远程队列管理器.doc

    使用WebSphere MQ管理远程队列管理器.doc

    Websphere Portal管理与开发

    在IT领域,特别是企业级应用开发与管理中,IBM Websphere Portal作为一款成熟且功能强大的门户解决方案,占据了举足轻重的地位。Websphere Portal不仅提供了丰富的特性,如个性化、社区构建、内容管理和集成服务,还...

    WebSphere内存管理

    WebSphere内存管理 java开发需要注意地方

    WebSphere MQ 系统管理指南 6.0

    《WebSphere MQ 系统管理指南 6.0》是一份详尽的文档,旨在为IT专业人士提供关于IBM WebSphere MQ版本6.0的全面系统管理指导。此指南覆盖了WebSphere MQ的基础知识、配置、操作与维护,以及高级主题,如故障排除和...

    Websphere mq 7.1 通道授权问题

    标题中的“通道授权问题”具体指的是在Websphere MQ 7.1或更高版本中,当尝试使用MQ管理员身份通过客户端连接远程访问队列管理器时,遇到错误代码2035:MQRC_NOT_AUTHORIZED的问题。这个问题通常出现在升级或新创建...

    关于 WebSphere 的应用部署

    在本文中,我们将深入探讨关于 WebSphere 应用部署的相关知识点,包括服务管理、应用安装与部署以及一些实用操作技巧。 首先,我们要了解如何管理 WebSphere 服务。在 Linux 环境下,可以通过 SSH 登录服务器并执行...

    WEBSPHERE开发与管理

    WEBSPHERE开发与管理 高清 v6

    WebSphere开发与管理_源代码

    本资源“WebSphere开发与管理_源代码”显然包含了关于如何开发、配置和管理WebSphere环境的相关源代码,这为我们深入理解WebSphere的工作原理以及实践操作提供了宝贵的材料。 1. **WebSphere架构** WebSphere采用...

    使用概要文件简化 WebSphere Application Server 管理

    【使用概要文件简化WebSphere Application Server管理】 WebSphere Application Server V6引入了概要文件(Profile)的概念,这是为了将产品的二进制文件与用户数据进行物理隔离,以简化系统的管理和维护。在V6之前...

    WebSphere ,WebSphere开发与管理

    WebSphere是IBM提供的一款企业级应用服务器,它是一个综合的软件平台,用于构建、部署和管理基于Java EE(Java Enterprise Edition)的应用程序。WebSphere开发与管理涉及的内容广泛,包括安装配置、应用程序的开发...

    关于websphere安装和卸载文档

    WebSphere是IBM推出的一款强大的企业级应用服务器,广泛应用于构建、部署和管理各种企业级应用程序。本文档将深入探讨WebSphere的安装、配置、发布应用程序以及卸载的全过程。 一、WebSphere的安装 1. **下载安装包...

    Websphere Application Server 6.1乱码问题解决办法

    然而,在实际使用过程中,乱码问题常常困扰着开发者和管理员,尤其是在处理不同编码格式的数据时。本文将详细介绍如何解决Websphere Application Server 6.1中的乱码问题。 首先,我们需要理解乱码问题产生的原因。...

    websphere 6.1 资料集

    Websphere 6.1 资料集涵盖了关于IBM的Websphere Application Server (WAS) 6.1版本的全面知识,包括安装、配置和实用操作等多个方面。Websphere是IBM提供的一个强大的企业级Java应用服务器,用于部署和管理基于Java...

    WebSphere实验报告.zip

    实验涵盖了Enterprise JavaBeans (EJB)的开发和部署,包括会话bean、实体bean和消息驱动bean的概念,以及如何在WebSphere环境中集成和管理EJB组件。 7. 实验七:JMS与消息传递 学生将学习Java消息服务(JMS)的...

    WEBSPHERE乱码问题的解决和处理

    ### WEBSPHERE乱码问题的解决与处理 在IT领域中,尤其是对于使用IBM WebSphere作为应用服务器的企业来说,遇到中文乱码的问题是一件非常头疼的事情。这类问题往往会影响到业务的正常运行,降低用户体验,因此及时...

    关于WebSphere建立jdbc数据源

    【关于WebSphere建立jdbc数据源】 在WebSphere应用服务器中,建立JDBC数据源是连接到数据库的关键步骤,它允许应用程序通过Java Database Connectivity (JDBC) API与数据库进行交互。以下是一个详细的步骤指南: 1...

    shiro1.3.2相关jar(解决Websphere下项目变慢问题)

    - **配置调整**:检查和调整Shiro的配置,确保其与Websphere环境的最佳匹配,例如会话管理策略、缓存设置等。 - **缓存策略**:利用Shiro的缓存机制减少不必要的计算和数据库查询,提高性能。 - **过滤器链优化**...

    Websphere配置与性能调优

    WebSphere还提供了预连接、会话管理和状态管理的服务。 在Windows NT系统上安装WebSphere应用服务器,需要满足一定的硬件和软件要求,包括至少128MB内存(推荐256MB)、Windows NT Pack 3或更高版本的操作系统。...

    Websphere实用手册.pdf

    - **预连接和会话管理**:提高了应用性能和可扩展性。 - **状态管理**:确保应用程序能够在不同的请求之间保持状态。 - **XML 文档支持**:支持最新的 XML 技术,使得数据交换更加灵活。 - **JSP 和 Servlet 版本...

Global site tag (gtag.js) - Google Analytics