1 拦截器 VS 过滤器
执行位置和范围
- 过滤器:Servlet 规范中的一部分,任何java web工程都可以使用。
- 拦截器:SpringMVC 框架自己的,只有使用了SpringMVC框架的工程才能用。
面向对象不同
- 过滤器:过滤器是基于Servlet规范的,它对请求和响应进行拦截和处理。它可以在请求到达Servlet之前预处理请求,也可以在响应返回给客户端之前后处理响应。
- 拦截器:拦截器是针对框架提供的处理器(如控制器)进行拦截和处理。它主要关注请求处理的前后环节,可以在方法执行前后、异常处理等时机进行拦截和增强。**拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦截的。**它也是 AOP 思想的具体应用。
使用场景
- 过滤器:具有较高的灵活性,可以拦截和处理所有的请求和响应。它可以在请求处理前和响应返回前进行预处理和后处理,但对于具体的处理器(如控制器)内部逻辑的拦截是有限的。过滤器只能对URL模式进行匹配和拦截,无法对具体的控制器方法进行精确的拦截。过滤器是在请求到达Servlet之前进行处理的,无法直接针对具体的控制器方法进行拦截和增强。
- 拦截器:拦截器相对于过滤器而言具有更高的定制性和灵活性。它可以针对具体的处理器(如控制器)进行拦截和增强,可以选择性地拦截请求,并且可以在请求处理前、处理后、异常处理等时机进行拦截和增强。拦截器是在Servlet容器中运行的,因此它无法直接拦截非Servlet请求,如静态资源的访问或其他非HTTP协议的请求。对于这些请求,可能需要使用其他方式进行拦截或处理。
2 自定义拦截器
我们要想自定义拦截器,要求必须实现:HandlerInterceptor 接口
第一步,新建一个类实现HandlerInterceptor
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 在控制器方法执行前调用,返回true表示继续处理,返回false表示中断请求处理
System.out.println("CustomInterceptor - preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 在控制器方法执行后、视图渲染前调用
System.out.println("CustomInterceptor - postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 在视图渲染后调用,即在DispatcherServlet进行视图清理之后调用
System.out.println("CustomInterceptor - afterCompletion");
}
}
第二步,配置拦截器(在springmvc.xml中)
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor())
.addPathPatterns("/**"); // 拦截所有路径
}
}