如何通过多个请求在会话上设置变量
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 世界中,这通常是后者。
在我的 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 世界中,这通常是后者。