从拦截器的preHandle方法调用控制器
我有一个拦截器,用于检查用户的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
}
}
这可行,但我想以一种不太明显的方式发送原因(不在url中)
我当时想直接调用NoAuthorisation控制器,但不知道该怎么做。
有什么建议和最佳做法吗?
回答:
SpringMVC具有 Flash 的概念。这是一种简单地将任意属性传递给具有2个特征的重定向请求的方法:
- 您不使用URL
- 您不仅限于字符串
在带@RequestMapping
注释的控制器中使用非常简单,因为您只需将RedirectAttributes参数传递给控制器方法,然后将其填充并返回一个redirect:...
字符串。
可以在拦截器中使用它,但是您必须明确要求使用带有来自的静态方法的输出Flash映射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参考手册中摘录:
Flash属性为一个请求提供了一种存储要在另一个请求中使用的属性的方式。重定向时最常需要此功能,例如Post / Redirect /
Get模式。Flash属性会在重定向之前(通常在会话中)临时保存,以便在重定向之后可供请求使用,并立即删除。
…
Flash属性支持始终为“ on”,并且不需要显式启用,即使不使用它也不会导致HTTP会话创建。在每个请求上,都有一个“输入”
FlashMap,它具有从上一个请求(如果有)传递来的属性,还有一个“输出”
FlashMap,它具有要为后续请求保存的属性。可以通过RequestContextUtils中的静态方法从Spring
MVC中的任何位置访问这两个FlashMap实例。
…重定向之后,来自“输入” FlashMap的属性会自动添加到服务于目标URL的控制器的模型中。
以上是 从拦截器的preHandle方法调用控制器 的全部内容, 来源链接: utcz.com/qa/434814.html