1.过滤器、拦截器、AOP的区别

2.拦截器
- SpringMVC拦截器用于拦截对控制器的访问
- 当用户需要访问自定义控制器时,首先执行拦截器,只有拦截器放行后才允许访问目标控制
- 创建interceptors包,并创建MyInterceptors类
- MyInterceptors类继承HandlerInterceptor接口
- 重写preHandle、postHandle、afterCompletion三个方法
-
创建拦截器类
-
当一个类实现了HandlerInterceptor接口后,则该类就成了一个拦截器类
-
配置拦截器需要重写接口中的三个方法
(1)preHandle:该方法在控制器执行前执行
-
该方法存在一个boolean类型的返回值
-
返回true,表示放行、继续执行拦截器后的拦截器或控制器
-
返回false,表示不放行、不继续执行拦截器后的拦截器或控制器
(2)postHandle:该方法在控制器执行后执行
(3)afterCompletion:该方法在上面两个方法执行结束后执行,用于清理所占用的资源
-配置拦截器
-
在Web容器配置类中配置
-
重写 public void addInterceptors(InterceptorRegistry registry) {}
-//注册新的拦截器
registry
.addInterceptor(new MyInterceptors())//注册拦截器
/**
* /**:表示拦截所有对控制器的访问
* /test/* :拦截所有对特使太目录下的控制器的访问
* /test/test2:只拦截某个拦截器
*/
.addPathPatterns("/test/test1")//设置拦截器的拦截路径,如果不配置拦截所有对控制器的方法
.order(2);//配置拦截器的执行顺序(优先级),数字越小优先级越高
registry
.addInterceptor(new MyInterceptors1())
.addPathPatterns("/**")
.order(1);
3.拦截器的实现
- 创建拦截器类
- 当一个类实现了HandlerInterceptor接口后,则该类就成了一个拦截器类
- 配置拦截器需要重写接口中的三个方法
- preHandle:该方法在控制器执行前执行
- 该方法存在一个boolean类型的返回值
- 返回true,表示放行、继续执行拦截器后的拦截器或控制器
- 返回false,表示不放行、不继续执行拦截器后的拦截器或控制器
- postHandle:该方法在控制器执行后执行
- afterCompletion:该方法在上面两个方法执行结束后执行,用于清理所占用的资源
- 配置拦截器
-
- 在Web容器配置类中配置
-
- 重写 public void addInterceptors(InterceptorRegistry registry) {}
- -//注册新的拦截器
- registry
- .addInterceptor(new MyInterceptors())//注册拦截器
- /**
- * /**:表示拦截所有对控制器的访问
- * /test/* :拦截所有对特使太目录下的控制器的访问
- * /test/test2:只拦截某个拦截器
- */
- .addPathPatterns("/test/test1")//设置拦截器的拦截路径,如果不配置拦截所有对控制器的方法
- .order(2);//配置拦截器的执行顺序(优先级),数字越小优先级越高
- registry
- .addInterceptor(new MyInterceptors1())
- .addPathPatterns("/**")
- .order(1);
4.源码
java
package com.jiazhong.interceptors;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 自定义拦截器
* 当一个类实现了HandlerInterceptor接口后,则该类就成了一个拦截器类
* 拦截器类需要重写接口中的三个方法
*/
public class MyInterceptors1 implements HandlerInterceptor {
/**
* 该方法在执行控制器之前执行
* @param request
* @param response
* @param handler
* @return true 表示放行,继续放行其后的拦截器或控制器
* false表示不放行,不继续放行其后的拦截器或控制器
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器MyInterceptors1-------->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("拦截器MyInterceptors1-------->postHandle被执行");
}
/**
* 在最后执行,当preHandle和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("拦截器MyInterceptors1-------->afterCompletion被执行");
}
}
java
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册新的拦截器
registry
.addInterceptor(new MyInterceptors())//注册拦截器
/**
* /**:表示拦截所有对控制器的访问
* /test/* :拦截所有对特使太目录下的控制器的访问
* /test/test2:只拦截某个拦截器
*/
.addPathPatterns("/test/test1")//设置拦截器的拦截路径,如果不配置拦截所有对控制器的方法
.order(2);//配置拦截器的执行顺序(优先级),数字越小优先级越高
registry
.addInterceptor(new MyInterceptors1())
.addPathPatterns("/**")
.order(1);
}