【问题标题】:java.lang.IllegalStateException thrown while setSessionToken in TokenHelperTokenHelper 中的 setSessionToken 时抛出 java.lang.IllegalStateException
【发布时间】:2017-12-19 05:35:55
【问题描述】:

我有一个在带有 Jetty 服务器的 Linux 操作系统上运行的 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)

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

【问题讨论】:

  • 贴一些代码。

标签: java jsp struts2 interceptor httpsession


【解决方案1】:

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

你可以创建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

如果HttpSession 不存在,此拦截器会创建它,同时SessionMap 会重新创建并放入ServletActionContext

这在 freemarker 中使用 &lt;@s.token&gt; 标签时特别有用 模板。该标签确实要求已经创建了 HttpSession 因为 freemarker 会立即向客户端提交响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2012-07-03
    • 2012-04-23
    • 2020-01-09
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多