拦截器
拦截器的定义
@Component
public class LoginAuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器postHandle");
return;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器afterCompletion");
}
}
拦截器的配置
@Configuration
public class LoginInterceptorConfiguration implements WebMvcConfigurer {
@Autowired
private LoginAuthInterceptor loginAuthInterceptor;
/** 拦截器注册 */
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginAuthInterceptor);
}
}
过滤器
过滤器的定义
@Component
public class LoginAuthFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
System.out.println("filter执行前");
filterChain.doFilter(request, response);
System.out.println("filter执行后");
}
}
过滤器的注册
@Configuration
public class LoginFilterConfiguration {
@Autowired
private LoginAuthFilter loginAuthFilter;
@Bean
public FilterRegistrationBean loginAuthFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(loginAuthFilter);
registration.addUrlPatterns("/*");
registration.setOrder(1);
return registration;
}
}
执行顺序
控制器的定义
@GetMapping("/login")
public String login() {
System.out.println("controller执行");
return "login";
}
输出结果
filter执行前
拦截器preHandle
controller执行
拦截器postHandle
拦截器afterCompletion
filter执行后
执行顺序总结
- 过滤器 filterChain.doFilter() 前 ——> 拦截器preHandle ——> 控制器 ——> 拦截器postHandle(未渲染页面)——> 拦截器afterCompletion(已渲染页面)——> 过滤器 filterChain.doFilter() 后