springBoot下的WebFilter自定义过滤器

背景

      项目中经常需要用拦截器或者过滤器,这一期主要进行一个简单的自定义过滤器。

 

 

一、 两种实现过滤器的方式

 

1.直接继承这个抽象的一次预处理Filter,不用重写更多方法,也强大方便。

public class AuthFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("我执行了:AuthFilter");

        String url = request.getServletPath();

        if (url.equals("/login")){
            System.out.println("login~~~~~~");
        };

        filterChain.doFilter(request,response);
    }
}

 

2.实现传统的Filter接口

 

public class CookieFilter implements Filter {



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

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse rep = (HttpServletResponse) response;
        String url = req.getServletPath();


        System.out.println("我执行了:CookieFilter");

        if (url.equals("/test")){

            System.out.println("不允许访问");
            rep.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
    }


    @Override
    public void destroy() {

    }
}

 

二、 注册到容器中

 

通过

@Configuration和@Bean 标签注解,实现注入spring容器Bean, 并且用FilterRegistrationBean把我们的过滤器 注册好。
@Configuration
public class MyFilter  {




    @Bean
    public FilterRegistrationBean  getCookieFilter(){

        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new CookieFilter());
        registration.addUrlPatterns("/*");
        registration.addServletNames("cookieFilter");
        registration.setOrder(2);

        return registration;
    }

    @Bean
    public FilterRegistrationBean  getAuthFilter(){

        FilterRegistrationBean registration = new FilterRegistrationBean();
     //注册你的过滤器 registration.setFilter(
new AuthFilter());
     //新增拦截路径,这里是代表所有请求 registration.addUrlPatterns(
"/*"); registration.addServletNames("authFilter");
     // 过滤器执行优先级 registration.setOrder(
1); return registration; } }

 

三、 关于排序order

  order越小,顺序越优先,执行服务跑起来看看结果:

 

posted @ 2021-07-10 11:42  Rick_Leee  阅读(549)  评论(0)    收藏  举报