过滤器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中,一种是通过注解,一种是通过过滤器配置

一、注解方式配置

  • 在过滤器上添加WebFilter注解

  • 启动类上添加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;

}