SpringMVC的拦截器
SpringMVC拦截器用于拦截对控制器的方法,当用户需要访问自定义控制器时,首先执行拦截器,只有拦截器放行后才允许继续访问目标控制。
拦截器的实现:1)创建拦截器类- 让MyInterceptor类实现了HandlerInterceptor接口,使该类成为一个拦截器类- 拦截器类需要重写接口中的三个方法:(1)preHandle:该方法在控制器执行前执行(2)postHandle:该方法在控制器执行后执行(3)afterCompletion:该方法在上面两个方法都执行结束后执行,用于清理所占用的资源2)配置拦截器- 在web容器配置类中配置- 重写public void addInterceptors(InterceptorRegistry registry) 方法并在方法中添加新拦截器的注册
在昨天的基础上,我们创建了一个拦截器类MyInterceptor
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 MyInterceptor implements HandlerInterceptor {/*** 该方法在执行控制器执行* @param request* @param response* @param handler* @return true表示放行,继续执行其后的拦截器或控制前* false表示不放行,不执行其后的拦截器或控制前* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("拦截器MyInterceptor---->preHandle方法被执行......");return true;}/*** 在执行控制器之后执行* @param request* @param response* @param handler* @param modelAndView* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("拦截器MyInterceptor---->postHandle方法被执行......");}/*** 在最后执行,当preHandle和postHandle都执行结束后执行* 该方法主要用于清理资源* @param request* @param response* @param handler* @param ex* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("拦截器MyInterceptor---->afterCompletion方法被执行......");}
}
在WebMVC配置类中配置已定义好的拦截器
/*** 配置已定义好的拦截器* @param registry 拦截器的注册器*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册新的拦截器registry.addInterceptor(new MyInterceptor())//注册拦截器/*** /**:表示拦截所有对控制器的访问(默认)* /test/*:拦截所有对test目录下控制器的访问* "/test/test1":只拦截某个具体的控制器*/.addPathPatterns("/test/**")//设置拦截器的拦截路径,如果不配置拦截所有对控制器的方法.order(1);//配置拦截器的执行顺序的(优先级),数字越小优先级越高//如果还有别的拦截器可以接着写
/* registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**").order(2); */}
运行结果:
过滤器、拦截器、AOP其作用的地方: