Java 从控制器(SpringPortletMVC)访问PortletSession属性(由拦截器设置)
我是SpringPortletMVC的新手,但在过去几天里我一直在努力学习它。 我的问题的背景如下Java 从控制器(SpringPortletMVC)访问PortletSession属性(由拦截器设置),java,session,liferay,spring-portlet-mvc,Java,Session,Liferay,Spring Portlet Mvc,我是SpringPortletMVC的新手,但在过去几天里我一直在努力学习它。 我的问题的背景如下 我有一个带有单个控制器的SpringPortlet MVCPortlet portlet被配置为在用户想要访问资源的任何时候调用HandlerInterceptor(方法“preHandleRender”) 拦截器检查用户是否经过身份验证,如果没有,则检索用户的Liferay凭据以管理许多其他Web服务上的身份验证(目前不感兴趣) 在此之后,拦截器将用户数据存储在PortletSession中 现
@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;
}
session.getAttribute("userProfile");
视图控制器类
@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();
.
.
}
}
@Controller(“视图控制器”)
@请求映射(value=“view”)
公共类视图控制器{
//@自动连线
私有WebServiceTemplate WebServiceTemplate=新WebServiceTemplate();
@渲染映射
公共字符串setModelAndView(RenderRequest请求,ModelMap tgtModel){
调试(“>启动”);
PortletConfiguration=PortletConfiguration.getInstance();
.
.
}
}
如果需要,我准备提供有关我的代码的更多信息。如果您将PortletSession指定为参数,Spring MVC将连接PortletSession
@RenderMapping
public String setModelAndView(RenderRequest request, PortletSession session, ModelMap tgtModel) {
logger.debug("<< | >> Starting.");
PortletConfiguration conf = PortletConfiguration.getInstance();
.
.
}
@RenderMapping
公共字符串setModelAndView(RenderRequest请求、PortletSession会话、ModelMap tgtModel){
调试(“>启动”);
PortletConfiguration=PortletConfiguration.getInstance();
.
.
}
有关支持的类型,请参阅。如果将PortletSession指定为参数,则Spring MVC将连接PortletSession
@RenderMapping
public String setModelAndView(RenderRequest request, PortletSession session, ModelMap tgtModel) {
logger.debug("<< | >> Starting.");
PortletConfiguration conf = PortletConfiguration.getInstance();
.
.
}
@RenderMapping
公共字符串setModelAndView(RenderRequest请求、PortletSession会话、ModelMap tgtModel){
调试(“>启动”);
PortletConfiguration=PortletConfiguration.getInstance();
.
.
}
有关支持的类型,请参阅。我能够解决问题并识别错误 在拦截器中,如我在问题中所示,我在PortletSession.APPLICATION\u范围中设置了会话属性“userProfile”。
session.setAttribute("userProfile", userProfileDomain,PortletSession.APPLICATION_SCOPE);
至于控制器,我知道您有多种选择:
- 将请求(在我的情况下是RenderRequest)作为参数传递,然后从请求中获取会话(在我的情况下是PortletSession),然后从会话中检索属性
- 直接将会话作为参数传递,然后从中检索属性
@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;
}
session.getAttribute("userProfile");
由于该属性是在PortletSession.APPLICATION\u作用域中设置的,因此无法获取任何内容。
正确的说明是:
session.getAttribute("userProfile",PortletSession.APPLICATION_SCOPE);
我能够解决这个问题并识别出我的错误 在拦截器中,如我在问题中所示,我在PortletSession.APPLICATION\u范围中设置了会话属性“userProfile”。
session.setAttribute("userProfile", userProfileDomain,PortletSession.APPLICATION_SCOPE);
至于控制器,我知道您有多种选择:
- 将请求(在我的情况下是RenderRequest)作为参数传递,然后从请求中获取会话(在我的情况下是PortletSession),然后从会话中检索属性
- 直接将会话作为参数传递,然后从中检索属性
@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;
}
session.getAttribute("userProfile");
由于该属性是在PortletSession.APPLICATION\u作用域中设置的,因此无法获取任何内容。
正确的说明是:
session.getAttribute("userProfile",PortletSession.APPLICATION_SCOPE);