我有一个在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)
请让我们知道可能的解决方案或建议,以解决该错误。
ERROR TokenHelper错误创建HttpSession由于响应致力于为客户端。您可以在将结果呈现给客户端之前使用CreateSessionInterceptor或HttpSession从操作中创建。
TokenHelper
HttpSession
CreateSessionInterceptor
您可以使用类似以下的代码创建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拦截器。
createSession
HttpSession如果不存在,此拦截器将创建,也SessionMap将重新创建并放入ServletActionContext。 <@s.token>在freemarker模板中使用标记时,这特别有用。标记确实要求HttpSession已经创建了一个,因为freemarker立即将响应提交给客户端。
HttpSession如果不存在,此拦截器将创建,也SessionMap将重新创建并放入ServletActionContext。
SessionMap
ServletActionContext
<@s.token>在freemarker模板中使用标记时,这特别有用。标记确实要求HttpSession已经创建了一个,因为freemarker立即将响应提交给客户端。
<@s.token>