1

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

视图控制器类

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

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

4

2 回答 2

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);
于 2013-01-28T08:35:52.067 回答
0

如果您将 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 。

于 2013-01-21T13:58:38.757 回答