2017-07-14 47 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會立即向客戶端提交響應。

相關問題