从拦截器的preHandle方法调用控制器

时间:2016-06-23 21:38:11

标签: spring-mvc

我有一个拦截器,用于检查用户的ldap组成员身份,如果认为错误则会重定向到NoAuthorisation页面,如下所示:

public class MyIntercept implements HandlerInterceptor {

public boolean preHandle (HttpServletRequest request, HttpServletReaponse response, Object handler) {
If ( // check access) {
  response.redirect(/NoAuthorisation?reason=Blablabla);
  return false;
}
return true
}

}

这有效,但我想以更不明显的方式发送原因(不是在网址中)

我在想我直接调用NoAuthorisation控制器,但不知道该怎么做。

任何建议和最佳做法?

2 个答案:

答案 0 :(得分:2)

SpringMVC有 Flash 的概念。这是一种简单地将任意属性传递给具有2个特征的重定向请求的方法:

  • 您不使用网址
  • 您不仅限于字符串

@RequestMapping带注释的控制器中使用非常简单,因为您只需将RedirectAttributes参数传递给控制器​​方法,填充它并返回redirect:...字符串。

它可以在拦截器中使用,但您必须明确要求使用RequestContextUtils中的静态方法输出闪存映射。

public boolean preHandle (HttpServletRequest request, HttpServletReaponse response, Object handler) {
If ( // check access) {
  Map<String, Object> flash = RequestContextUtils.getOutputFlashMap(request);
  // populate the flash map with attributes you want to pass to redirected controller
  response.redirect(/NoAuthorisation?reason=Blablabla);
  return false;
}
return true
}

}

摘自Spring reference manual

  

Flash属性为一个请求提供了一种存储打算在另一个请求中使用的属性的方法。重定向时最常需要这种方法 - 例如,Post / Redirect / Get模式。 Flash重定向(通常在会话中)之前临时保存Flash属性,以便在重定向后立即将其移除。

     

...

     

Flash属性支持始终处于“打开”状态,并且不需要显式启用,但如果不使用,则永远不会导致创建HTTP会话。在每个请求上都有一个“输入”FlashMap,其中包含从先前请求(如果有)传递的属性,以及一个“输出”FlashMap,其中包含要为后续请求保存的属性。两个FlashMap实例都可以通过RequestContextUtils中的静态方法从Spring MVC中的任何位置访问。

     

...重定向后,“输入”FlashMap中的属性会自动添加到服务于目标URL的控制器的模型中。

答案 1 :(得分:1)

您可以从请求中获取会话,并将会话中的原因作为会话参数,并从重定向端点的会话中恢复。

不要忘记尽快清理你的会话。