SpringMVC中的拦截器和Servlet中的过滤器

什么是过滤器

过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。

什么是拦截器

SpringMVC中的处理器拦截器类似过滤器Filter,用于对处理器进行预处理和后处理。

用户可以自定义一些拦截器来实现特定的功能。自定义拦截器,必须实现HandlerInterceptor接口

它也是AOP思想的具体应用。

谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts2中称为拦截器栈 Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

过滤器和拦截器的区别

  1. 过滤器是Servlet规范中的一部分,任何java web工程都可以使用。
  2. 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
  3. 过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
  4. 拦截器它是只会拦截访问的控制器方法,如果访问的是jsp、html、css、image或者js是不会进行拦截的。
  5. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  6. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次 。
  7. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

使用自定义拦截器

  1. 编写拦截器类,实现HandlerInterceptor接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    /**
    * 自定义拦截器
    */
    public class MyInterceptor implements HandlerInterceptor {
    /**
    * 预处理:Controller方法执行之前
    * return true 放行,执行下一个拦截器,如果没有,执行Controller中的方法
    * return false 不放行 可以使用request、response设置跳转页面、内容
    */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("MyInterceptor执行了。。。前");
    //request.getRequestDispatcher("/response.jsp").forward(request,response);
    return true;
    }
    /**
    * 后处理:Controller方法执行之后,success.jsp执行之前
    * 可以使用request、response设置跳转页面、内容
    */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("MyInterceptor执行了。。。后");
    // request.getRequestDispatcher("/response.jsp").forward(request,response);
    }
    /**
    * 最后处理:success.jsp执行之后,该方法会执行
    * 不可以使用request、response设置跳转页面、内容
    */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("MyInterceptor执行了。。。最后");
    }
    }
  2. 配置拦截器

    在springmvc.xml文件中配置拦截器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!--配置拦截器-->
    <mvc:interceptors>
    <!--配置拦截器-->
    <mvc:interceptor>
    <!--要拦截的具体方法-->
    <mvc:mapping path="/user/*"/>
    <!--不要拦截的具体方法-->
    <!--<mvc:exclude-mapping path=""/>-->
    <!--配置拦截器对象-->
    <bean class="com.ligangit.interceptor.MyInterceptor"/>
    </mvc:interceptor>
    </mvc:interceptors>
  3. jsp页面代码

    • index.jsp

      1
      <br><%--SpringMVC的拦截器--%><a href="user/testInterceptor">SpringMVC的拦截器</a>
    • success.jsp

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
      <html>
      <head>
      <title>Title</title>
      </head>
      <body>
      <h3>执行成功!!!!</h3>
      <% System.out.println("success.jsp执行了。。。。。"); %>
      </body>
      </html>
  4. 控制器代码

    1
    2
    3
    4
    5
    6
    7
    8
    /**
    * SpringMVC的拦截器
    */
    @RequestMapping(value = "testInterceptor")
    public String testInterceptor(){
    System.out.println("testInterceptor方法执行了。。。");
    return "success";
    }
  5. 结果

    结果

配置多个拦截器

  1. 编写多个拦截器类,实现HandlerInterceptor接口

  2. 配置拦截器

    在springmvc.xml文件中配置拦截器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <!--配置拦截器-->
    <mvc:interceptors>
    <!--配置拦截器-->
    <mvc:interceptor>
    <!--要拦截的具体方法-->
    <mvc:mapping path="/user/*"/>
    <!--不要拦截的具体方法-->
    <!--<mvc:exclude-mapping path=""/>-->
    <!--配置拦截器对象-->
    <bean class="com.ligangit.interceptor.MyInterceptor"/>
    </mvc:interceptor>
    <!--配置第二个拦截器-->
    <mvc:interceptor>
    <!--要拦截的具体方法-->
    <mvc:mapping path="/user/*"/>
    <!--不要拦截的具体方法-->
    <!--<mvc:exclude-mapping path=""/>-->
    <!--配置拦截器对象-->
    <bean class="com.ligangit.interceptor.MyInterceptor2"/>
    </mvc:interceptor>
    </mvc:interceptors>
  3. 结果

    结果

  4. hello

最后更新: 2020年07月12日 00:04

原始链接: http://ligangit.com/2020/07/11/SpringMVC-拦截器/

× 请我吃糖~
打赏二维码