一尘不染

在TokenHelper中的setSessionToken时引发java.lang.IllegalStateException

jsp

我有一个在Jetty服务器的Linux OS上运行的Java应用程序。

Struts操作,该操作会更改Linux系统的日期和时间以及在呈现另一个页面之后的操作。动作已成功执行,但是在呈现页面时它将抛出java.lang.IllegalStateException。

我在该JSP页面中使用了“ s:token”来防止表单的两次提交。

错误跟踪如下

ERROR TokenHelper Error creating HttpSession due response is committed to client. You can use the CreateSessionInterceptor or create the HttpSession from your action before the result is rendered to the client: null
 java.lang.IllegalStateException
    at org.eclipse.jetty.server.session.AbstractSession.checkValid(AbstractSession.java:109)
    at org.eclipse.jetty.server.session.HashedSession.checkValid(HashedSession.java:73)
    at org.eclipse.jetty.server.session.AbstractSession.getAttribute(AbstractSession.java:132)
    at org.apache.struts2.dispatcher.SessionMap.get(SessionMap.java:161)
    at org.apache.struts2.dispatcher.SessionMap.put(SessionMap.java:179)
    at org.apache.struts2.util.TokenHelper.setSessionToken(TokenHelper.java:93)
    at org.apache.struts2.util.TokenHelper.setToken(TokenHelper.java:79)
    at org.apache.struts2.components.Token.buildToken(Token.java:107)
    at org.apache.struts2.components.Token.evaluateExtraParams(Token.java:97)
    at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:886)
    at org.apache.struts2.components.UIBean.end(UIBean.java:535)
    at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
    at org.apache.jsp.pages.Continue_jsp._jspx_meth_s_token_0(org.apache.jsp.pages.Continue_jsp:495)
    at org.apache.jsp.pages.Continue_jsp._jspx_meth_s_form_0(org.apache.jsp.pages.Continue_jsp:429)
    at org.apache.jsp.pages.Continue_jsp.access$6(org.apache.jsp.pages.Continue_jsp:407)
    at org.apache.jsp.pages.Continue_jsp$Continue_jspHelper.invoke2(org.apache.jsp.pages.Continue_jsp:1197)
    at org.apache.jsp.pages.Continue_jsp$Continue_jspHelper.invoke(org.apache.jsp.pages.Continue_jsp:1221)

请让我们知道可能的解决方案或建议,以解决该错误。


阅读 515

收藏
2020-06-10

共1个答案

一尘不染

ERROR
TokenHelper错误创建HttpSession由于响应致力于为客户端。您可以在将结果呈现给客户端之前使用CreateSessionInterceptorHttpSession从操作中创建。

您可以使用类似以下的代码创建Http会话

    ActionContext context = ActionContext.getContext();
    SessionMap<String, T> sessionMap = (SessionMap<String, T>) context.getSession();

    if (sessionMap == null) {
        sessionMap = new SessionMap<String, T>(ServletActionContext.getRequest());
        context.setSession((Map<String, Object>) sessionMap);
    }

createSession拦截器

HttpSession如果不存在,此拦截器将创建,也SessionMap将重新创建并放入ServletActionContext

<@s.token>在freemarker模板中使用标记时,这特别有用。标记确实要求HttpSession已经创建了一个,因为freemarker立即将响应提交给客户端。

2020-06-10