从控制器(Spring Portlet MVC)访问PortletSession属性(由拦截器设置)



我是Spring Portlet MVC的新手,但是最近几天我一直在努力学习它。我的问题的上下文如下

    我有一个带有单个控制器的Spring Portlet MVC Portlet。
  1. portlet 配置为在用户希望访问资源时调用HandlerInterceptor(方法'preHandleRender')。
  2. 拦截器检查用户是否被认证,如果没有,它检索用户的Liferay凭证来管理许多其他web服务的认证(现在不有趣)。
  3. 在此之后,拦截器将用户数据存储在PortletSession中。

现在,我应该如何从控制器内部的拦截器检索存储在PortletSession中的用户数据??

sessionInterceptor.preHandleRender

@Override
public boolean preHandleRender(RenderRequest request, RenderResponse response, Object handler) throws Exception {
    PortletSession session = request.getPortletSession(true);
              .
              .
              .
    session.setAttribute("userProfile", userProfileDomain,PortletSession.APPLICATION_SCOPE);
              .
              .
              .
    return true;
}
<<p> ViewController类/strong>
@Controller("viewController")
@RequestMapping(value = "view")
public class ViewController {
    //@Autowired
    private WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
    @RenderMapping
    public String setModelAndView(RenderRequest request, ModelMap tgtModel) {
        logger.debug("<<  |  >> Starting.");
        PortletConfiguration conf = PortletConfiguration.getInstance();
              .
              .
    }
}

如果需要,我准备提供关于我的代码的更多信息。

我能够解决问题并确定我的错误。

在拦截器中,正如我在问题中所示,我在PortletSession.APPLICATION_SCOPE中设置了会话属性"userProfile"

session.setAttribute("userProfile", userProfileDomain,PortletSession.APPLICATION_SCOPE);

至于控制器,我知道你有多种选择:

  • 传递请求(RenderRequest,在我的例子中)作为参数,从请求中获取会话(PortletSession,在我的例子中),然后从会话中检索属性。
  • 直接传递会话作为参数,然后从中检索属性。
然而,无论你是走第一条路还是第二条路,如果你在控制器中使用以下指令
session.getAttribute("userProfile");

你不会得到任何东西,因为属性是在PortletSession.APPLICATION_SCOPE中设置的。

正确的指令是:

session.getAttribute("userProfile",PortletSession.APPLICATION_SCOPE);

如果您指定PortletSession作为参数,Spring MVC将连接PortletSession。

 @RenderMapping
 public String setModelAndView(RenderRequest request, PortletSession session, ModelMap tgtModel) {
    logger.debug("<<  |  >> Starting.");
    PortletConfiguration conf = PortletConfiguration.getInstance();
          .
          .
 }

最新更新