如何通过多个请求在会话上设置变量

How to set variable on a session through multiple request

在我的 Liferay 7 主题中,我想记住用户点击的最后一页。所以,在我的主题中,我有以下内容:

<#if nav_item.isSelected()>
  ${request.getSession().setAttribute("LAST_ACTIVE",nav_item.getName())}
</#if>

在我的 portlet JSP 中,然后我想检索值:

request.getSession().getAttribute("LAST_ACTIVE")

但是,我总是得到一个 null 值,这可能是因为每次请求都会重新创建会话。如何存储该值以使其持续多个请求?

Portles(来自您提到的 .jsp)可能有一个私有 portlet 范围的会话,它不需要与您的主题会话完全相等。 您应该在前面加上: LIFERAY_SHARED_ 作为会话属性的前缀。 如果这样不行,可以尝试在读写会话属性时添加PortletSession.APPLICATION_SCOPE作为附加作用域参数

我建议你换个角度看问题。 session 方法不错,但可能更好的方法是使用过滤器或 pre-action 来填充请求属性。这样做的好处是您可以将属性设置为实际更改。用主题session的方法,你总是有点落后。

根据您的评论,将我对安德烈问题的评论提升为答案:

主题中的

${request.getClass().getName()} 通常显示 HttpServletRequest 的后代,而 portlet 通常使用 PortletRequest - 这些是不同的元素(如此处所示,具有私有属性,除非显式共享)。

在 portlet JSPs 中,请注意 ${request}JSP 规范 预定义为 HttpServletRequest(并且因此在 portlet 中通常是无用的),而 Portlet 规范 定义了 ${renderRequest}。确保在 JSP 中使用正确的那个。在 portlet 世界中,这通常是后者。