我是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);