【问题标题】:Access PortletSession attributes (set by interceptor) from the controller (Spring Portlet MVC)从控制器(Spring Portlet MVC)访问 PortletSession 属性(由拦截器设置)
【发布时间】:2013-01-17 15:13:19
【问题描述】:

我是 Spring Portlet MVC 的新手,但最近几天我一直在努力学习。 我的问题的上下文如下

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

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

【问题讨论】:

    标签: java session liferay spring-portlet-mvc


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      如果您将 PortletSession 指定为参数,则 Spring MVC 会连接它。

       @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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        • 2014-08-27
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多