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