Skip to content

12. 拦截器

12.1. 定义类实现拦截器接口

需要实现,并实现抽象方法HandlerInterceptor

java
package com.neuedu.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;

/**
 * 项目    : spring-mvc-java1
 * 创建时间 :2020/3/31  13:47 31
 * author  :jshand-root
 * site    :  http://314649444.iteye.com
 * 描述     : 登录的拦截器
 */
public class ValidateLoginInterceptor implements HandlerInterceptor {

    /**
     * 在控制器方法之前执行的
     * @param request
     * @param response
     * @param handler
     * @return   false:控制的方法不会就行执行,同时postHandle、afterCompletion 方法也都不会继续执行
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("登录的拦截器:preHandle");
        return true;
    }

    /**
     * 在控制器方法之后执行 ,如果有异常不会执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("登录的拦截器:postHandle");

    }

    /**
     * 在控制器方法之后执行 有异常也正常的执行
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("登录的拦截器:afterCompletion");
    }
}

12.2. 将拦截器配置到具体的HandlerMapping上

xml
<mvc:interceptors>
    <mvc:interceptor>
      <!--
        http://127.0.0.1:8080/springmvc/abc
        http://127.0.0.1:8080/springmvc/def  -->
       <!-- <mvc:mapping path="/*" />-->


        <!--
        包含子目录
        http://127.0.0.1:8080/springmvc/user/insert
        http://127.0.0.1:8080/springmvc/user/update
        -->
        <mvc:mapping path="/**" />
        <bean class="com.neuedu.interceptor.ValidateLoginInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

12.3. 测试

12.3.0.1. 单个拦截器并且preHandler方法返回false

12.3.0.2. 单个拦截器并且preHandler方法返回true

12.3.1. preHandle

​ 在控制器方法之前执行的,

返回结果

True:相当于是FIlter的放行

False:后续的拦截器方法(postHandle、afterCompletion),控制器方法都不执行

12.3.2. postHandle

如果控制器方法没有异常,则在方法之后执行postHandle,如果有异常则此方法不会执行。

12.3.3. afterCompletion

在控制器方法之后执行postHandle,无论是否存在异常。

12.4. 多个拦截器

第二个拦截器

java
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* 项目    : spring-mvc-java1
* 创建时间 :2020/3/31  13:47 31
* author  :jshand-root
* site    :  http://314649444.iteye.com
* 描述     : 设置中文编码的拦截器
*/
public class CharsetInterceptor implements HandlerInterceptor {

   /**
    * 在控制器方法之前执行的
    * @param request
    * @param response
    * @param handler
    * @return   false:控制的方法不会就行执行,同时postHandle、afterCompletion 方法也都不会继续执行
    * @throws Exception
    */
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

       request.setCharacterEncoding("utf-8");
       response.setCharacterEncoding("utf-8");

       System.out.println("1 编码的拦截器:preHandle");
       return true;
   }

   /**
    * 在控制器方法之后执行 ,如果有异常不会执行
    * @param request
    * @param response
    * @param handler
    * @param modelAndView
    * @throws Exception
    */
   @Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
       System.out.println("1 登录的拦截器:postHandle");

   }

   /**
    * 在控制器方法之后执行 有异常也正常的执行
    * @param request
    * @param response
    * @param handler
    * @param ex
    * @throws Exception
    */
   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
       System.out.println("1 登录的拦截器:afterCompletion");
   }
}

12.5. 多个拦截器preHandle方法返回true

12.6. 多拦截器的总结

当第一个拦截器返回true的时候,afterCompletion方法可以执行,第二个拦截器返回false后续的方法都不执行。只要有一个拦截器返回fasle则控制器的方法就不执行。

建议将必须要执行的拦截器前置(例如:无论是否登录成功都需要设置的编码的拦截器)

Released under the MIT License.