【问题标题】:session variable empty in the JSP on first access in a Struts2/Spring application在 Struts2/Spring 应用程序中首次访问时,JSP 中的会话变量为空
【发布时间】:2017-12-05 16:03:25
【问题描述】:

在用户首次访问时,我在 JSP 中检索会话数据时遇到问题。

我的 Struts 操作中有一个会话范围的 bean“上下文”,其中填充了一些“配置文件”。 该 URL 配置为允许 Spring Security 中的匿名用户访问。

在第一次访问页面时,会话在我的操作中正确初始化,但当我在 struts 标记中使用它时,它被视为空。

当我在 JSP 中使用 java 代码时,我可以看到 session 是正确的:

<% System.out.println(((my.bean.SessionBean)session.getAttribute("context")).getProfiles()); %> => OK !!

session: <s:property value="%{#session}"/> => KO (empty)

session: ${session} => KO (empty)

结果是 Struts 标签无法在我的 jsp 中检索“配置文件”列表。

当我刷新页面时,它运行良好。只有在首次访问时初始化会话时才会失败。用Struts的debug模式检查过,第一次session变量为空({})。

在第一次访问时重定向到一个额外的 Struts 动作解决了这个问题。但是这个解决方案对我来说并不理想。

有人知道这个问题吗? 为什么 Struts 会得到一个空会话?

谢谢

【问题讨论】:

    标签: java spring struts2


    【解决方案1】:

    曾经有过类似的问题,罪魁祸首是我们所有 JSP 中的页面指令:

    <%@ page session="false"%>
    

    当会话属性为“false”时,您无法从 JSP 页面或会话范围内的任何 bean 访问会话对象。

    【讨论】:

    • 不幸的是我的jsp中没有这个指令
    【解决方案2】:

    我不了解 OGNL,但与您的 Java 代码行等效的 JSP EL 表达式不是 ${session}。这是

    ${sessionScope.context.profiles}
    

    ${session} 查找名为“session”的页面/请求/会话/应用程序属性。

    【讨论】:

    • 你是对的,${sessionScope.context.profiles} 从第一次访问就可以正常工作。但在我的 Struts 标记中,它应该与 "%{#session}" () 一起使用,而 "sessionScope" 在这种情况下不起作用。我猜 Struts 提供了属性“session”。
    • 阅读struts.apache.org/2.0.14/docs/ognl-basics.html,好像表达的是#session.context.profiles。读取struts.apache.org/2.0.14/docs/jsp.html,标签因此应该是&lt;s:property value="%{#session.context.profiles}"/&gt;
    • 感谢您的帮助。语法是正确的,因为它适用于页面刷新。我的问题是会话变量在第一次调用时为空: 都无法返回价值。我以前的 struts 应用程序从来没有遇到过这个问题..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 2016-11-24
    • 2012-08-03
    • 2011-08-20
    相关资源
    最近更新 更多