引言
由于最近在做应用集成平台,即实现独立部署的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会话重写的方式,需要手工启用这个功能并重启应用服务器:
由于我的集成插件默认是以添加";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不死,程序灾难未平!
相关推荐
快捷设置Websphere的超时问题,永久会话的设置问题统统解决!
使用WebSphere MQ管理远程队列管理器.doc
在IT领域,特别是企业级应用开发与管理中,IBM Websphere Portal作为一款成熟且功能强大的门户解决方案,占据了举足轻重的地位。Websphere Portal不仅提供了丰富的特性,如个性化、社区构建、内容管理和集成服务,还...
WebSphere内存管理 java开发需要注意地方
标题中的“通道授权问题”具体指的是在Websphere MQ 7.1或更高版本中,当尝试使用MQ管理员身份通过客户端连接远程访问队列管理器时,遇到错误代码2035:MQRC_NOT_AUTHORIZED的问题。这个问题通常出现在升级或新创建...
《WebSphere MQ 系统管理指南 6.0》是一份详尽的文档,旨在为IT专业人士提供关于IBM WebSphere MQ版本6.0的全面系统管理指导。此指南覆盖了WebSphere MQ的基础知识、配置、操作与维护,以及高级主题,如故障排除和...
在本文中,我们将深入探讨关于 WebSphere 应用部署的相关知识点,包括服务管理、应用安装与部署以及一些实用操作技巧。 首先,我们要了解如何管理 WebSphere 服务。在 Linux 环境下,可以通过 SSH 登录服务器并执行...
WEBSPHERE开发与管理 高清 v6
本资源“WebSphere开发与管理_源代码”显然包含了关于如何开发、配置和管理WebSphere环境的相关源代码,这为我们深入理解WebSphere的工作原理以及实践操作提供了宝贵的材料。 1. **WebSphere架构** WebSphere采用...
【使用概要文件简化WebSphere Application Server管理】 WebSphere Application Server V6引入了概要文件(Profile)的概念,这是为了将产品的二进制文件与用户数据进行物理隔离,以简化系统的管理和维护。在V6之前...
WebSphere是IBM提供的一款企业级应用服务器,它是一个综合的软件平台,用于构建、部署和管理基于Java EE(Java Enterprise Edition)的应用程序。WebSphere开发与管理涉及的内容广泛,包括安装配置、应用程序的开发...
WebSphere是IBM推出的一款强大的企业级应用服务器,广泛应用于构建、部署和管理各种企业级应用程序。本文档将深入探讨WebSphere的安装、配置、发布应用程序以及卸载的全过程。 一、WebSphere的安装 1. **下载安装包...
然而,在实际使用过程中,乱码问题常常困扰着开发者和管理员,尤其是在处理不同编码格式的数据时。本文将详细介绍如何解决Websphere Application Server 6.1中的乱码问题。 首先,我们需要理解乱码问题产生的原因。...
Websphere 6.1 资料集涵盖了关于IBM的Websphere Application Server (WAS) 6.1版本的全面知识,包括安装、配置和实用操作等多个方面。Websphere是IBM提供的一个强大的企业级Java应用服务器,用于部署和管理基于Java...
实验涵盖了Enterprise JavaBeans (EJB)的开发和部署,包括会话bean、实体bean和消息驱动bean的概念,以及如何在WebSphere环境中集成和管理EJB组件。 7. 实验七:JMS与消息传递 学生将学习Java消息服务(JMS)的...
### WEBSPHERE乱码问题的解决与处理 在IT领域中,尤其是对于使用IBM WebSphere作为应用服务器的企业来说,遇到中文乱码的问题是一件非常头疼的事情。这类问题往往会影响到业务的正常运行,降低用户体验,因此及时...
【关于WebSphere建立jdbc数据源】 在WebSphere应用服务器中,建立JDBC数据源是连接到数据库的关键步骤,它允许应用程序通过Java Database Connectivity (JDBC) API与数据库进行交互。以下是一个详细的步骤指南: 1...
- **配置调整**:检查和调整Shiro的配置,确保其与Websphere环境的最佳匹配,例如会话管理策略、缓存设置等。 - **缓存策略**:利用Shiro的缓存机制减少不必要的计算和数据库查询,提高性能。 - **过滤器链优化**...
- **预连接和会话管理**:提高了应用性能和可扩展性。 - **状态管理**:确保应用程序能够在不同的请求之间保持状态。 - **XML 文档支持**:支持最新的 XML 技术,使得数据交换更加灵活。 - **JSP 和 Servlet 版本...
WEBSPHERE开发与管理+涂传滨,邱丽娟 高清 在淘宝上5块买的 websphere v6