来自 SRTServletResponse (com.ibm:jaxws.thinclient 8.5) 的 IllegalStateException - 具有 spring 和 SSO 配置的 Websphere

IllegalStateException from SRTServletResponse (com.ibm:jaxws.thinclient 8.5) - websphere with spring and SSO configuration

在 websphere 上配置 SSO 时,我遇到了奇怪的问题。它不会干扰应用程序的工作(或者我不知道干扰)但是这个错误出现在日志中

日志:

 2019-12-06 14:18:03,754 ERROR DbLogEntryDao                  - com.somecompany.product.web.system.exception.BasicHandlerExceptionResolver.resolveException (location: BasicHandlerExceptionResolver.java:65) Unexpected error at server SRPZZAPP0392.INSIM.BIZ: [java.lang.IllegalStateException [1575638283660] :null]
 2019-12-06 14:18:03,754 ERROR BasicHandlerExceptionResolver  - Unexpected error
 java.lang.IllegalStateException
     at com.ibm.ws.webcontainer.srt.SRTServletResponse.addSessionCookie(SRTServletResponse.java:2177)
     at com.ibm.ws.session.SessionAffinityManager.setCookie(SessionAffinityManager.java:589)
     at com.ibm.ws.session.SessionManager.adaptAndSetCookie(SessionManager.java:750)
     at com.ibm.ws.session.SessionManager.createSession(SessionManager.java:737)
     at com.ibm.ws.session.SessionContext.getIHttpSession(SessionContext.java:505)
     at com.ibm.ws.session.SessionContext.getIHttpSession(SessionContext.java:426)
     at com.ibm.ws.webcontainer.srt.SRTRequestContext.getSession(SRTRequestContext.java:113)
     at com.ibm.ws.webcontainer.srt.SRTServletRequest.getSession(SRTServletRequest.java:2212)
     at com.ibm.ws.webcontainer.srt.SRTServletRequest.getSession(SRTServletRequest.java:2196)
     at com.somecompany.product.web.utils.ContextHelper.getUserId(ContextHelper.java:178)
     at com.somecompany.product.web.utils.ContextHelper.getUser(ContextHelper.java:182)
     at com.somecompany.product.web.system.interceptors.SsoInterceptor.preHandle(SsoInterceptor.java:55)
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:865)
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
     at com.somecompany.product.web.spring.productDispatcherServlet.doService(productDispatcherServlet.java:28)
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
     at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:575)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
     at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1233)
     at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:782)
     at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:481)
     at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
     at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
     at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:79)
     at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:967)
     at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1107)
     at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:1404)
     at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:551)
     at com.ibm.ws.webcontainer.webapp.WebApp.sendError(WebApp.java:3496)
     at com.ibm.wsspi.webcontainer.collaborator.CollaboratorHelper.processSecurityPreInvokeException(CollaboratorHelper.java:145)

ContextHelper.getUserId(ContextHelper.java:178) 代码:

public static Long getUserId(HttpServletRequest request) {
 return (Long) request.getSession().getAttribute(SessionAttribute.USER);
}

有人遇到过类似的问题吗?

IllegalStateException 被抛出是因为 ContextHelper 要求创建一个会话,这最终会在响应已经提交后将会话 cookie 添加到响应中。

您可以通过确保在提交响应之前创建会话来解决此问题 - 例如。在您的应用程序处理请求的早期调用 getSession()

或者,可以通过将 getSession() 替换为 getSession(boolean create) 并传递 false 来避免此错误 - 如果会话尚不存在,这将阻止创建会话。但是,在出现此错误的情况下,将返回空 HttpSession,因此您需要进一步更新应用程序逻辑以避免 NullPointerExceptions

https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getSession(boolean)