我是Spring Portlet MVC的新手,但是最近几天我一直在努力研究。
我的问题的背景如下


我有一个带有单个控制器的Spring Portlet MVC Portlet。
Portlet被配置为在用户想要访问资源时调用HandlerInterceptor(方法“ preHandleRender”)。
拦截器会检查用户是否已通过身份验证,如果未通过身份验证,则它将检索用户的Liferay凭据来管理许多其他Web服务上的身份验证(目前并不有趣)。
之后,拦截器将用户数据存储在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;
}


ViewController类

@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);

07-26 08:55