【问题标题】:Struts2 session data not available in JSP until I refresh在我刷新之前,Struts2 会话数据在 JSP 中不可用
【发布时间】:2011-03-23 04:39:01
【问题描述】:

我正在构建一个 Struts2 应用程序,其中数据在请求标头中发送到我的应用程序。我有一个自定义拦截器,它抓取这些数据并使用它从数据库中检索一些数据并将其存储在会话中。然后我在生成的 JSP 中使用这个会话数据。一个问题:在我刷新页面之前,会话变量为空。

这是我的堆栈:

<interceptor-stack name="myStack">
    <interceptor-ref name="myInterceptor"/>
    <interceptor-ref name="defaultStack"/>
</interceptor-stack>

这是我在 myInterceptor 中的拦截方法:

ActionContext context = invocation.getInvocationContext();
HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST);
HttpSession session =  request.getSession(true);

MyObject obj = new MyObject();
String header = request.getHeader("HEADER_VALUE");
if(header != null) {
    obj.loadByHeader(header);
    session.setAttribute("value", obj);
}
return invocation.invoke();

这里是 JSP 代码:

<s:if test="#session.value == null">
    ...
</s:if>

就像我说的,当我使用此值刷新或转到另一个页面时,这将起作用。难道我做错了什么?或者直到下一次我才能获得价值?如果是后者,是否有其他方法可以在第一次通过时获取该数据?

【问题讨论】:

    标签: java jsp session struts2


    【解决方案1】:

    你应该可以一次性设置并使用它!我没有看到您提供的内容有任何问题,我的猜测是您第一次渲染视图而没有通过您的拦截器。

    这有两种可能发生:1,您有多个包裹。其中一个包定义了您的自定义拦截器堆栈,而另一个则没有。第一次不渲染视图然后随后的渲染确实通过您的拦截器的那个,2)如果您有多个将渲染视图的操作并且您在操作级别应用了拦截器,那么它也是可能的。

    将打印/日志消息扔到拦截器中,并确保它在你认为的时候被执行。

    编辑:defaultStack 和 myInterceptor 的顺序相反,因为 params 拦截器不会在 myInterceptor 之前运行。

    【讨论】:

    • 很抱歉,您没有回答提供的约束中的问题。如果我正在刷新页面并让它工作,那么它必须遵循相同的路径。此外,我确实有日志记录。我记录了标头已发送,并使用以下内容记录结果:“session.getAttribute("value") set in the session”。它打印出来很好,告诉我它已正确设置。
    • 很抱歉,但我没有读到应该的,答案已修改。
    猜你喜欢
    • 2014-11-25
    • 2021-10-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多