2017-07-14 48 views
1

我有一个在带有Jetty服务器的Linux操作系统上运行的Java应用程序。TokenHelper中的setSessionToken引发java.lang.IllegalStateException

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) 

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

+0

发表一些代码。 –

回答

1

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

您可以到

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类似的代码创建的Http session。

这个拦截器创建HttpSession如果不存在的话,也SessionMap被重建并投入ServletActionContext

这在使用freemarker 模板中的<@s.token>标记时特别有用。标签确实需要HttpSession已经创建 ,因为freemarker会立即向客户端提交响应。

相关问题