面试官:说说过滤器和拦截器的区别? 这个问题面试题库算是比较经典的,这两个我相信很多同学在工作中都有接触过,但如果没有经过系统的整理,还真的不好说出个123来,那老湿机在此这面就把它俩和常用的AOP、ControllerAdvice放一起,带你做一个比较全面的认识。
1. 了解4种拦截方法的执行顺序
先上一个栗子,看四种拦截方法并驾齐驱使用时,谁先谁后:
/**
* ============Filter过滤器============
*/
@Slf4j
@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
log.info("Filter 进入");
filterChain.doFilter(request, response);
log.info("Filter 退出");
}
}
l
/**
* ============Interceptor过滤器============
*/
public class DemoInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("Interceptor preHandle 进入");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("Interceptor postHandle 进入");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("Interceptor afterCompletion 进入");
}
}
/**
* ============ControllerAdvice============
*/
@ControllerAdvice
public class DemoControllerAdvice {
@InitBinder
public void init(WebDataBinder binder) {
log.info("ControllerAdvice init 进入");
binder.setFieldDefaultPrefix("user.");
}
@ExceptionHandler(Exception.class)
public String handleException(Exception e) {
log.info("ControllerAdvice handleException 进入");
return "error";
}
}
/**
* ============AOP============
*/
@Aspect
@Component
public class DemoAspect {
@Pointcut("(@target(org.springframework.web.bind.annotation.RestController)) " +
"&& within(cn.demo.api..*) && execution(public * *(..))")
public void pointcut() {
}
@Around(value = "pointcut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
log.info("Aop 进入")