1、定义拦截器
@Component
public class MyIntercepter implements HandlerInterceptor {
private static Logger logger = LoggerFactory.getLogger(MyIntercepter.class);
// 该方法的执行时机是,当某个 url 已经匹配到对应的 Controller 中的某个方法,且在这个方法执行之前。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
String methodname = method.getName();
logger.info("拦截到了{}方法", methodname);
return true; //返回true才会继续执行下一步
}
// 该方法的执行时机是,当某个 url 已经匹配到对应的 Controller 中的某个方法,且在执行完了该方法,但是在 DispatcherServlet 视图渲染之前。
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
logger.info("执行完方法之后进执行(Controller方法调用之后),但是此时还没进行视图渲染");
}
// 顾名思义,该方法是在整个请求处理完成后(包括视图渲染)执行,这时做一些资源的清理工作,这个方法只有在 `preHandle(……)` 被成功执行后并且返回 true 才会被执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
logger.info("整个请求都处理完咯,DispatcherServlet也渲染了对应的视图咯,此时我可以做一些清理的工作了");
}
}
2、配置拦截器
@Configuration
public class MyInterceptorConfig extends WebMvcConfigurationSupport {
@Autowired
MyIntercepter myIntercepter;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myIntercepter).addPathPatterns("/**");
super.addInterceptors(registry);
}
**
* 用来指定静态资源不被拦截,否则继承WebMvcConfigurationSupport这种方式会导致静态资源无法 直接访问
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
super.addResourceHandlers(registry);
}
}
3、测试controller
@Controller
@RequestMapping("/page")
public class IndexController {
@RequestMapping("/index")
public String test() {
return "index";
}
}
4、输出结果