概述:
拦截器 Interceptor 在 Spring MVC 中的地位等同于 Servlet 规范中的过滤器 Filter,拦截的是处理器的执行,由于是全局行为,因此常用于做一些通用的功能,如请求日志打印、权限控制等(就是拦截一些资源的)
实现拦截步骤
1、创建拦截类,实现HandlerIntercepator接口并重写里面的方法
1.1、preHandle方法是在请求执行之前执行方法
1.2、postHandle方法是在controller层中的方法执行完毕后,视图没有进行渲染时执行
1.3、afterCompletion方法在该请求执行完过后执行
1.4、在方法中返回值为true放行,false进行拦截
2、配置文件加入拦截器,<mvc:Intercepators>标签中写拦截器
3、在配置文件中单个拦截器的标签中注入该拦截器的拦截的类
spring-mvc.xml文件配置
代码及真理
spring-mvc.xml文件配置
<!--所有拦截器都写在这个服目录下-->
<mvc:interceptors>
<!--配置具体单个拦截器-->
<mvc:interceptor>
<!--配置拦截规则-->
<mvc:mapping path="/**"/> //拦截所有请求
<!--注入拦截请求的类-->
<bean class="com.hqyj.gyq.myInterceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截java类
package com.wzk.Interceptor;
import org.springframework.core.annotation.Order;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*@ClassNname: 拦截器类
*@Description: 拦截器
*@Author wxk
*@Date 2023/8/31
*@Version 1.0
*/
@Order(1) //拦截器优先级,数值越小,级别越高
public class MyInterceptor implements HandlerInterceptor {
//请求执行之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandler...........");
return false; //true进行放行,false进行拦截
}
//controller里面的方法执行完毕,视图还没有渲染的时候完成
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
//该请求执行完毕执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
注意:
@Order(数字)注解中的数字定义拦截器的级别,数字越小,拦截级别越高
拦截器和过滤器的 区别?
-
- ①:拦截器是基于java的反射机制的,而过滤器是基于函数的回调。
- ②:拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。
- ③:拦截器只对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
- ④:拦截器可以访问action上下文、值、栈里面的对象,而过滤器不可以。
- ⑤:在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
- ⑥:拦截器可以获取IOC容器中的各个bean,而过滤器不行,在拦截器里注入一个service,可以调用业务逻辑。