定义拦截器
只需要实现HandlerInterceptor
接口即可,该接口内有三个方法
- preHandler(…)
- 当某个 URL 已经匹配到对应的 Controller 中的某个方法,且在这个方法执行之前。
- 可以决定是否将请求放行,这是通过返回值来决定的,返回 true 则放行,返回 false 则不会向后执行。
- postHandler(…)
- 当某个 URL 已经匹配到对应的 Controller 中的某个方法,且在执行完了该方法,但是在 DispatcherServlet 视图渲染之前。
- 这个方法中有个 ModelAndView 参数,可以在此做一些修改动作。
- afterCompletion(…)
- 在整个请求处理完成后(包括视图渲染)执行,这时做一些资源的清理工作
- 这个方法只有在
preHandle(...)
被成功执行后并且返回 true 才会被执行。
代码
在Interceptor中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) { return true; }
HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); System.out.println("run " + method.getName()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("执行完方法之后,但是在视图渲染之前"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("视图渲染之后,可以做一些清理工作"); } }
|
在Config中
1 2 3 4 5 6 7 8
| @Configuration public class MyInterceptorConfig extends WebMvcConfigurationSupport { @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); } }
|