06-拦截器

nobility 发布于 2022-10-28 05-SpringMVC 673 次阅读


拦截器

若是Maven项目,需要引入javax.servlet-api包,注意要将依赖范围设置为provided,因为拦截器中的参数需要用到该包中的类

自定义类实现HandlerInterceptor接口,重写preHandle()postHandle()afterCompletion()方法,这三个方法都是默认方法

  • preHandle():前置执行处理,进入控制器之前执行,若返回false则后续不会执行
  • postHandle():目标资源已被SpringMVC进行处理,即控制器方法被执行完(return了之后)后执行
  • afterCompletion():响应文本已产生,即响应HTML字符串或JSON字符串生成后执行

同时设置多个拦截器的执行顺序为,请求时按照配置顺序进行执行,响应时按照配置逆序执行,若期间某个拦截器出现了异常,则后续拦截器不会被执行,而是直接逆序执行afterCompletion()方法,而不会执行postHandle()方法

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

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

public class MyInterceptor implements HandlerInterceptor {
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("前置处理");
    return true;  //返回true后续会接着执行
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("控制器方法执行完毕");
  }

  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("响应文本已经生成");
  }
}

之后再在Spring全局配置文件applicationContext.xml中添加下面配置,但是要注意<mvc:default-servlet-handler/>设置对拦截器是不起作用的,静态资源还是会被拦截器拦截到

<mvc:interceptors>  <!--设置SpringMVC拦截器,-->
  <mvc:interceptor>  <!--设置单个拦截器,可设置多个拦截器-->
    <mvc:mapping path="/**"/>  <!--拦截的路径,可是设置多个-->
    <mvc:exclude-mapping path="/**.jsp"/>  <!--不拦截的路径,可是设置多个-->
    <bean class="com.MyInterceptor"/>  <!--拦截器类-->
  </mvc:interceptor>
</mvc:interceptors>

使用下面代码进行测试

public class Main {
  @GetMapping("/test")
  @ResponseBody
  public String test() {
    System.out.println("控制器中的方法");
    return "test";
  }
}
加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2022-10-28