在TokenHelper

时间:2017-07-14 07:47:14

标签: java jsp struts2 interceptor httpsession

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

Struts动作,它改变了Linux系统的日期和时间,并在它呈现另一个页面之后。 动作成功执行但在渲染页面时会抛出java.lang.IllegalStateException。

我用过" s:token"在该JSP页面中,用于防止双重提交表单。

错误跟踪如下

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)

请告知我们处理错误的可能解决方案或建议。

1 个答案:

答案 0 :(得分:1)

  

错误TokenHelper创建HttpSession到期响应的错误已提交给客户端。在将结果呈现给客户端之前,您可以使用CreateSessionInterceptor或从操作中创建HttpSession

您可以使用类似于

的代码创建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 interceptor

  

如果HttpSession不存在,此拦截器会创建SessionMap,同时重新创建ServletActionContext并放入<@s.token>

     

在freemarker中使用HttpSession标记时,此功能特别有用   模板。标记确实需要已创建{{1}}   因为freemarker立即向客户提交回复。