SpringBoot中过滤器的使用

Filter概述:

  • 概念:Filter是servlet2.3后增加的功能,运行在服务器端的程序,先与之相关的servlet或jsp页面之前运行。
  • 作用:过滤请求和相应
    • 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
    • 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
    • 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
    • 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
  • 应用场景:自动登录;统一编码;过滤一些特殊符号或敏感词

Filter的生命周期:

  • 在项目启动的时候, 服务器创建Filter的对象,调用 init() 方法实现初始化操作。
  • 每当请求来的时候,服务器获取一个线程,执行 doFilter() 方法,实现过滤的逻辑。
  • 当服务器移除Filter的时候或者服务器正常关闭的时候,服务器调用 destroy() 方法,实现销毁操作。

下面代码来说明Filter的生命周期和执行过程。

/* 自定义过滤器 */
public class TestFilter implements Filter {

    /* 初始化 */
    @Override
    public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter已初始化");
    }

    /* 执行过滤的方法 */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("执行Request过滤");
        // 放行
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("执行Response过滤");
    }

    /* 销毁 */
    @Override
    public void destroy() {
        System.out.println("Filter已销毁");
    }
}
/* controller层中访问servlet */
@POST
@Path("httpfilter")
public String httpFilterTest(String str) {
    System.out.println("正在访问servlet...");
    return str;
}

程序运行结果:

  • 初始化
    在这里插入图片描述
    ​ 可以看出,Filter对象的初始化是在项目启动的时候进行的。

  • 执行过滤的方法
    在这里插入图片描述
    ​ 可以看出,ServletResquest访问servlet和ServletResponse返回前端都会经过过滤器。

  • 销毁

    在服务器正常关闭的时候,服务器调用 destroy() 方法,实现销毁操作。

过滤器在SpringBoot中的使用

1、定义一个过滤器,实现Filter接口并重写Filter接口的三个方法。

public class TestFilter implements Filter {

 @Override
 public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
 }

 @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
         throws IOException, ServletException {
     HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
     HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
     String str = httpServletRequest.getHeader("user-type");
     if(str!=null && str.equals("vip")){
         filterChain.doFilter(httpServletRequest, httpServletResponse);
     }
 }

 @Override
 public void destroy() {
 }
}

2、注册过滤器

@Configuration
public class FilterConfig {
 @Bean
 public FilterRegistrationBean filterRegistration() {
     FilterRegistrationBean registrationBean = new FilterRegistrationBean();
     registrationBean.setFilter(new TestFilter());
     registrationBean.addUrlPatterns("/rest/filter/*");
     registrationBean.setName("testFilter");
     registrationBean.setOrder(1);
     return registrationBean;
 }
}

本例中,对于所有 “/rest/filter/*” 的请求,在访问servlet之前必须要经过过滤器的认可。如果请求头中 “user-type” 的值是 “vip” ,则过滤器会放行,调用 filterChain.doFilter() 方法;否则不会调用 filterChain.doFilter() 放行,永远也访问不到servlet服务器。

当使用多个过滤器时,可以通过 registrationBean.setOrder() 方法来设置过滤器的优先级,方法中参数值越小,优先级越高。

你可能感兴趣的:(SpringBoot,filter,servlet,spring,boot,spring,过滤器)