SpringMVC 拦截器 Interceptor

发布于 2023-05-01 21:40:09 字数 3596 浏览 68 评论 0

SpringMVC 拦截器是个非常好用的东西,对于每个请求有分别对进入控制器前、执行控制器后渲染之前、渲染之后的行为都能拦截。通常我们用拦截器实现了权限管理、MyBatis 分页功能等。


实现 HandlerInterceptor 接口

拦截器一般直接实现 HandlerInterceptor 接口,Spring 也只处理该类型的拦截器。有些文章说也可以选择继承 HandlerInterceptorAdapter 抽象类,此方式我强烈不建议,不仅因为该类并不是严格的拦截器接口,也浪费了继承位置,并且 afterConcurrentHandlingStarted 方法在其实并没有什么卵用,Spring 完全调用不到该方法。

public class FuckInterceptor implements HandlerInterceptor {

  //进入控制器之前执行,若为false,不执行控制器.
  public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {

      return true;
  }

  //出控制器后,若有新页面并未渲染之前执行
  public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

  }

  //整个请求结束之后
  public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

  }
}

// ===============================================================
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
}

public interface AsyncHandlerInterceptor extends HandlerInterceptor {
  void afterConcurrentHandlingStarted(
            HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception;
}

实现 WebRequestInterceptor 接口

其次还有实现 WebRequestInterceptor 接口的方式,为 WebRequest 已经封装 HttpServletRequest 的全部常用操作。但此类拦截器并不能让如上述拦截器一般,停止请求继续进行,所以通常只做请求的预备工作。

public class FuckInterceptor implements WebRequestInterceptor {

  //进入控制器之前执行.
  public void preHandle(WebRequest request) throws Exception {}

  //出控制器后,若有新页面并未渲染之前执行
  public void postHandle(WebRequest request, ModelMap model) throws Exception {}

  //整个请求结束之后
  public void afterCompletion(WebRequest request, Exception ex) throws Exception {}
}

public interface WebRequest extends RequestAttributes {

    String getHeader(String headerName);

    String[] getHeaderValues(String headerName);

    Iterator<String> getHeaderNames();

    String getParameter(String paramName);

    String[] getParameterValues(String paramName);

    Iterator<String> getParameterNames();

    Map<String, String[]> getParameterMap();

    Locale getLocale();

    String getContextPath();

    String getRemoteUser();

    Principal getUserPrincipal();

    boolean isUserInRole(String role);

    boolean isSecure();

    boolean checkNotModified(long lastModifiedTimestamp);

    boolean checkNotModified(String etag);

    boolean checkNotModified(String etag, long lastModifiedTimestamp);

    String getDescription(boolean includeClientInfo);

}

配置拦截器

引用标签

xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
  http://www.springframework.org/schema/mvc/spring-mvc.xsd"

配置拦截器

<mvc:interceptors>
  <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
  <mvc:interceptor>
    <mvc:mapping path="/fuck/**"/>
    <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
    <bean/>
  </mvc:interceptor>
</mvc:interceptors>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

幻想少年梦

暂无简介

文章
评论
28 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文