过滤器Filter

过滤器是基于Servlet的拦截,是在Web容器进行拦截。常用的场景有登录、权限判断、tonken过滤等。当然使用拦截器也可以,拦截器是基于Spring的拦截,可以作用于Controller等的方法中。如果是Web的话,没有特别要求,还是使用过滤器吧(本人观点)

编写过滤器

新建过滤器 需要实现javax.servlet.Filter接口,并重新其中的方法

public class LoginFilter implements Filter {

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {

  }

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

  }

  @Override
  public void destroy() {

  }
}

HttpServletRequest request = (HttpServletRequest) servletRequest;

HttpServletResponse response = (HttpServletResponse) servletResponse;

可以转换为我们平时使用的HttpServletRequest 和 HttpServletResponse

如果不需要过滤 直接调用

filterChain.doFilter(servletRequest, servletResponse);

如果需要过滤 根据自己的业务处理

例如:判断token、ip等,直接通过HttpServletResponse 返回异常处理

重定向跳转 response.sendRedirect(request.getContextPath()+"/*.html");

界面返回response.getWriter().write(this.NO_LOGIN);

String requestType = request.getHeader("X-Requested-With");

//判断是否是ajax请求

if(requestType!=null && "XMLHttpRequest".equals(requestType))

过滤器配置

配置方式有2中,一种是通过注解,一种是通过过滤器配置

一、注解方式配置

  1. 在过滤器上添加WebFilter注解
  2. 启动类上添加ServletComponentScan注解

filterName 为过滤器的名称,urlPatterns表示过滤的url的规则

@WebFilter(filterName = "loginFilter",urlPatterns = {"/*"})

public class LoginFilter implements Filter {….}

@SpringBootApplication
@ServletComponentScan
public class FileUploadApplication {…}

二、通过过滤器注册配置类使用过滤器

@Configuration
public class WebComponent2Config {
@Bean
public FilterRegistrationBean someFilterRegistration1() {

   //新建过滤器注册类
   FilterRegistrationBean registration = new FilterRegistrationBean();
   // 添加我们写好的过滤器
   registration.setFilter( new LoginFilter());
   // 设置过滤器的URL模式
   registration.addUrlPatterns("/*");
   return registration;

}

}

扩展

当有多个过滤器需要按顺序执行时怎么办?
使用注解的配置方法不能配置顺序,但是可以通过过滤器名字的字典顺序实现顺序过滤(比如AFilter就会在BFilter前执行),显然这种方法看起来不怎么正经。
但是我们可以使用第二种配置方法.

通过给注册类设置order,order越小,执行优先级越高

@Bean

public FilterRegistrationBean someFilterRegistration1() {
    //新建过滤器注册类
    FilterRegistrationBean registration = new FilterRegistrationBean();
    // 添加我们写好的过滤器
    registration.setFilter( new LoginFilter());
    // 设置过滤器的URL模式
    registration.addUrlPatterns("/*");
    //设置过滤器顺序
    **registration.setOrder(1);**
    return registration;

}