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

时间:2013-01-17 15:13:20

标签: java session liferay spring-portlet-mvc

我是Spring Portlet MVC的新手,但是我在过去的几天里一直在努力学习。 我的问题的背景是以下

  1. 我有一个带有单个控制器的Spring Portlet MVC portlet。
  2. portlet 配置为在用户想要访问资源的任何时候调用HandlerInterceptor (方法'preHandleRender')。
  3. 拦截器检查用户是否经过身份验证,如果没有,则检索用户的Liferay凭据以管理其他许多Web服务的身份验证(目前不感兴趣)。
  4. 此后,拦截器将用户数据存储在PortletSession 中。
  5. 现在,我该如何通过拦截器从控制器内部检索存储在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();
                  .
                  .
        }
    }
    

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

2 个答案:

答案 0 :(得分:1)

我能够解决问题并识别我的错误。

在拦截器中,正如我在问题中所示,我在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);

答案 1 :(得分:0)

Spring MVC如果将其指定为参数,则将PortletSession连接起来。

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

    PortletConfiguration conf = PortletConfiguration.getInstance();
          .
          .
 }

有关支持的类型,请参阅http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/portlet.html#portlet-ann-requestmapping-arguments