定义拦截器

只需要实现HandlerInterceptor接口即可,该接口内有三个方法

  1. preHandler(…)
    • 当某个 URL 已经匹配到对应的 Controller 中的某个方法,且在这个方法执行之前。
    • 可以决定是否将请求放行,这是通过返回值来决定的,返回 true 则放行,返回 false 则不会向后执行。
  2. postHandler(…)
    • 当某个 URL 已经匹配到对应的 Controller 中的某个方法,且在执行完了该方法,但是在 DispatcherServlet 视图渲染之前。
    • 这个方法中有个 ModelAndView 参数,可以在此做一些修改动作。
  3. 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 {

// 加上这句话,避免axios调用接口时报错(因为此处用到了强制转换)
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("/**");
}
}