package sbt;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class XxxInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//Controller方法调用之前调用
System.out.println(">>>>>>>>>>>>>>>>>>>>preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//Controller方法调用之后调用
System.out.println(">>>>>>>>>>>>>>>>>>>>postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//DispatcherServlet渲染对应的视图之后调用
System.out.println(">>>>>>>>>>>>>>>>>>>>afterCompletion");
}
}
拦截器的实现还有一种方式: WebRequestInterceptor, 这里说下他们的不同点, 具体的代码实现都差不多
WebRequestInterceptor 的 preHandle 没有返回值, 方法参数中没有response, 获取request更方便, 不影响后续流程, . 也就是说WebRequestInterceptor 更针对处理请求, 比如预设参数等.
HandlerInterceptor 的 preHandle 有返回值, 会影响到后续处理, 有response, 获取request相对会稍微多写点代码, 更注重业务处理, 比如12306可以判断是否售票时间内, 权限, 请求验签等等.
整体来说HandlerInterceptor的功能更强大, 但获取request相对代码会多点
@Component
public class WebMvcConfig extends WebMvcConfigurationSupport{
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration registration = registry.addInterceptor(new XxxInterceptor());
registration.addPathPatterns("/**");//拦截
registration.excludePathPatterns("*.html");//不拦截
}
}
@Component
public class WebMvcConfig implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration registration = registry.addInterceptor(new XxxInterceptor());
registration.addPathPatterns("/**");//拦截
registration.excludePathPatterns("*.html");//不拦截
}
}
注册拦截器时这两个没有任何区别,但设置别的mvc配置,可能会有区别,区别是当继承WebMvcConfigurationSupport时会覆盖原配置,而WebMvcConfigurer是自定义配置。
/*
和/**
的区别/*
是拦截所有的文件夹,不包含子文件夹
/**
是拦截所有的文件夹及里面的子文件夹
classpath:只会到WEB-INF\classes中查找文件。
classpath*:不仅包含WEB-INF\classes,还会到WEB-INF\lib下的每个jar的classpath进行查找。
注意: 用classpath*:需要遍历所有的classpath,所以加载速度是很慢的;因此,尽量避免使用classpath*。