Java 从控制器(SpringPortletMVC)访问PortletSession属性(由拦截器设置)

Java 从控制器(SpringPortletMVC)访问PortletSession属性(由拦截器设置),java,session,liferay,spring-portlet-mvc,Java,Session,Liferay,Spring Portlet Mvc,我是SpringPortletMVC的新手,但在过去几天里我一直在努力学习它。 我的问题的背景如下 我有一个带有单个控制器的SpringPortlet MVCPortlet portlet被配置为在用户想要访问资源的任何时候调用HandlerInterceptor(方法“preHandleRender”) 拦截器检查用户是否经过身份验证,如果没有,则检索用户的Liferay凭据以管理许多其他Web服务上的身份验证(目前不感兴趣) 在此之后,拦截器将用户数据存储在PortletSession中 现

我是SpringPortletMVC的新手,但在过去几天里我一直在努力学习它。 我的问题的背景如下

  • 我有一个带有单个控制器的SpringPortlet MVCPortlet
  • 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;
    }
    
    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);