【问题标题】:Same Application deployed in two different websphere 8 profiles share session?相同的应用程序部署在两个不同的 websphere 8 配置文件共享会话中?
【发布时间】:2014-04-22 09:26:48
【问题描述】:

我有一个应用程序 WAR。我在 Websphere 8.0.0.0 上创建了两个配置文件 AppSrv01、AppSrv02。

我的应用程序在 struts 1.1 上具有 MQ 连接、J2ee 应用程序。

我已经在服务器 AppSrv01 作为上下文 A 和 AppSrv02 作为上下文 B 部署了 WAR。

我的应用程序中有会话侦听器,它将记录总可用会话。

场景如下......

登录到 url localhost:9082/A,进入其中的某个页面。

进入并登录到 url localhost:9082/B,在同一浏览器的另一个选项卡中转到其中的某个页面。

转到 url localhost:9082/A,点击现有页面中的一些链接或 url。

当涉及到 SessionListener 时从服务器进行远程调试...它显示在给定堆栈下方

Daemon Thread [WebContainer : 10] (Suspended (breakpoint at line 24 in SessionCounterListener)) 
SessionCounterListener.sessionCreated(HttpSessionEvent) line: 24    
WasHttpSessionObserver(HttpSessionObserver).sessionCreated(ISession) line: 111  
SessionEventDispatcher.sessionCreated(ISession) line: 98    
SessionManager.createISession(String, int, boolean) line: 268   
SessionManager.createSession(ServletRequest, ServletResponse, SessionAffinityContext, boolean) line: 640    
WsSessionContext(SessionContext).getIHttpSession(HttpServletRequest, HttpServletResponse, boolean, boolean) line: 485   
WsSessionContext(SessionContext).getIHttpSession(HttpServletRequest, HttpServletResponse, boolean) line: 419    
SRTRequestContext.getSession(boolean, WebApp) line: 104 
SRTServletRequest.getSession(boolean) line: 2099    
SRTServletRequest.getSession() line: 2083   
RequestProcessor.processLocale(HttpServletRequest, HttpServletResponse) line: 631   
RequestProcessor.process(HttpServletRequest, HttpServletResponse) line: 230 
ActionServlet.process(HttpServletRequest, HttpServletResponse) line: 1482   
ActionServlet.doPost(HttpServletRequest, HttpServletResponse) line: 525 
ActionServlet(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 595   
ActionServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 668   
ServletWrapperImpl(ServletWrapper).service(ServletRequest, ServletResponse, WebAppServletInvocationEvent) line: 1147    
ServletWrapperImpl(ServletWrapper).handleRequest(ServletRequest, ServletResponse, WebAppDispatcherContext) line: 722    
ServletWrapperImpl(ServletWrapper).handleRequest(ServletRequest, ServletResponse) line: 449 
ServletWrapperImpl.handleRequest(ServletRequest, ServletResponse) line: 178 
WebAppFilterManagerImpl(WebAppFilterManager).invokeFilters(ServletRequest, ServletResponse, IServletContext, RequestProcessor, EnumSet<CollaboratorInvocationEnum>) line: 1020  
CacheServletWrapper.handleRequest(ServletRequest, ServletResponse) line: 87 
WSWebContainer(WebContainer).handleRequest(IRequest, IResponse) line: 883   
WSWebContainer.handleRequest(IRequest, IResponse) line: 1659    
WCChannelLink.ready(VirtualConnection) line: 195    
HttpInboundLink.handleDiscrimination() line: 452    
HttpInboundLink.handleNewRequest() line: 511    
HttpInboundLink.processRequest() line: 305  
HttpInboundLink.ready(VirtualConnection) line: 276  
NewConnectionInitialReadCallback.sendToDiscriminators(VirtualConnection, TCPReadRequestContext, boolean) line: 214  
NewConnectionInitialReadCallback.complete(VirtualConnection, TCPReadRequestContext) line: 113   
AioReadCompletionListener.futureCompleted(IAbstractAsyncFuture, Object) line: 165   
AsyncFuture(AbstractAsyncFuture).invokeCallback(ICompletionListener, AbstractAsyncFuture, Object) line: 217 
AsyncFuture(AsyncChannelFuture).fireCompletionActions() line: 161   
AsyncFuture.completed(long) line: 138   
ResultHandler.complete(AsyncFuture, int, int) line: 204 
ResultHandler.runEventProcessingLoop(boolean) line: 775 
ResultHandler$2.run() line: 905 
ThreadPool$Worker.run() line: 1648  

它正在创建另一个会话实例。需要了解它为什么要创建另一个实例。

【问题讨论】:

  • 如果没有代码,这将非常难以诊断。

标签: websphere ibm-mq websphere-8


【解决方案1】:

当你在 IE 中打开选项卡时,对于 IE 来说它的会话相同。所以每个域只有一个 cookie JSESSIONID。

当你去localhost:9082/A - 你有JSESSIONID就像SESSIONID-A。

当你转到localhost:9082/B 时 - 你有JSESSIONID 就像SESSIONID-B。

所以当您访问 AppSrv01 上的应用程序时,JSESSIONID 转到 AppSrv01 是 SESSIONID-B。 Appserver 不知道这个会话 id,所以它认为它是一个新用户并创建一个会话。

尝试打开 IE-> 文件 -> 新会话并访问 AppSrv02 上的应用程序,您将不会遇到上述问题。

如果您有 IEWATCH 或 Fidler 之类的东西,您将能够看到来自客户端/浏览器的 JSESSIONID。

【讨论】:

【解决方案2】:

还有一个设置HttpSessionIdReuse可能也可以帮助解决这个问题。我知道它适用于同一单元中的多个服务器,但我不确定它是否适用于配置文件。

http://www-01.ibm.com/support/docview.wss?uid=swg21210881

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 2019-11-06
    • 2010-09-23
    • 2019-09-27
    • 2013-03-19
    • 2011-09-23
    • 2013-03-25
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多