我有一个应用程序WAR。我在Websphere 8.0.0.0上创建了两个配置文件AppSrv01,AppSrv02。
我的应用程序在struts 1.1上具有MQ连接,J2ee应用程序。
我已将服务器AppSrv01上的WAR部署为上下文A,将AppSrv02部署为上下文B.
我的应用程序中有会话监听器,它会记录总可用会话。
情景如下......
登录并登录url localhost:9082 / A,转到其中的某个页面。
进入并登录url localhost:9082 / B,在同一浏览器的另一个标签页面中转到其中的某个页面。
转到网址localhost:9082 / A,点击现有网页上的部分链接或网址。
来自服务器的远程调试,当它来到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
它正在创建另一个会话实例。需要了解它为什么要创建另一个实例。
答案 0 :(得分:0)
当您在IE中打开选项卡时,对于IE同一会话。因此,每个域只有一个cookie JSESSIONID。
当你转到localhost:9082/A
时,你JSESSIONID
就像SESSIONID-A
一样。
当你转到localhost:9082/B
时,你JSESSIONID
就像SESSIONID-B
一样。
因此,当您在AppSrv01上访问应用程序时,JSESSIONID
转到AppSrv01的是SESSIONID-B
。 Appserver不知道此会话ID,因此它认为它是新用户并创建会话。
尝试打开IE-&gt;档案 - &gt;新会话并访问AppSrv02上的应用程序您不会遇到上述问题。
如果您有类似IEWATCH或Fidler的内容,您将能够看到来自客户端/浏览器的JSESSIONID
。
答案 1 :(得分:0)
还有一个设置HttpSessionIdReuse
可能也可以提供帮助。我知道它适用于同一Cell中的多个服务器,但我不确定它是否适用于Profiles。