常见面试题

filter和intercept有什么区别?

  1. 拦截器只对action方法起作用,而过滤器几乎对所有的请求(包括前端页面的请求地址)起作用。
  2. 拦截器是基于反射实现的,而过滤器是基于函数回调实现的。
  3. 过滤器依赖于servlet容器,而拦截器不依赖与servlet容器。
  4. 拦截器没有init方法,过滤器会在容器初始化的时候就进行创建,并调用init方法。

什么是filter?

过滤器可以实现对用户的请求和对用户的响应进行过滤。

filter定义

  1. public interface Filter {
  2. default void init(FilterConfig filterConfig) throws ServletException {
  3. }
  4. void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
  5. default void destroy() {
  6. }
  7. }

filter的函数回调是怎么实现的?

filter这里用到了责任链模式,即如果一个filter判断这次请求无效的时候,就可以终止流程。如果判定有效的时候,就可以传给下一个filter继续过滤。

生命周期

  1. 在servlet容器初始化时候创建,并调用init方法
  2. servlet容器接受到用户的请求时,会执行filter的dofilter方法
  3. 在servlet容器销毁时,会调用destroy方法