springboot 过滤器FilterRegistrationBean详解

一:基础知识

1.通过FilterRegistrationBean实例注册,该方法能够设置过滤器之间的优先级

2.为了演示优先级,这里创建2个测试过滤器类:Test1Filter、Test2Filter

通过实现javax.servlet.Filter接口,覆盖其doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)方法,决定拦截或放行

    public class Test1Filter implements Filter {
     
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
                throws IOException, ServletException {
            // TODO Auto-generated method stub
            HttpServletRequest request=(HttpServletRequest)arg0;
            System.out.println("自定义过滤器filter1触发,拦截url:"+request.getRequestURI());
            arg2.doFilter(arg0,arg1);
        }
     
    }

    public class Test2Filter implements Filter {
     
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
                throws IOException, ServletException {
            // TODO Auto-generated method stub
            HttpServletRequest request=(HttpServletRequest)arg0;
            System.out.println("自定义过滤器filter2触发,拦截url:"+request.getRequestURI());
            arg2.doFilter(arg0,arg1);
        }
     
    }

通过在springboot的configuration中配置不同的FilterRegistrationBean实例,来注册自定义过滤器

这里创建一个configuration类

    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
     
    import com.example.demo.filter.Test1Filter;
    import com.example.demo.filter.Test2Filter;
     
    @Configuration
    public class DemoConfiguration {
     
        @Bean
        public FilterRegistrationBean<Test1Filter> RegistTest1(){
            //通过FilterRegistrationBean实例设置优先级可以生效
            //通过@WebFilter无效
            FilterRegistrationBean<Test1Filter> bean = new FilterRegistrationBean<Test1Filter>();
            bean.setFilter(new Test1Filter());//注册自定义过滤器
            bean.setName("flilter1");//过滤器名称
            bean.addUrlPatterns("/*");//过滤所有路径
            bean.setOrder(1);//优先级,最顶级
            return bean;
        }
        @Bean
        public FilterRegistrationBean<Test2Filter> RegistTest2(){
            //通过FilterRegistrationBean实例设置优先级可以生效
            //通过@WebFilter无效
            FilterRegistrationBean<Test2Filter> bean = new FilterRegistrationBean<Test2Filter>();
            bean.setFilter(new Test2Filter());//注册自定义过滤器
            bean.setName("flilter2");//过滤器名称
            bean.addUrlPatterns("/test/*");//过滤所有路径
            bean.setOrder(6);//优先级,越低越优先
            return bean;
        }
    }

其中

1第一个bean拦截所有路径,而第二个只拦截/test/*路径

2第一个bean优先级设置了1,而第二个设置了6,越低越优先,所以过滤器1应该在过滤器2前面拦截

运行springboot,访问/test/*请求如下图,再访问/v请求如下图只拦截了过滤器1,而过滤器2路径不匹配

以上原文地址:spring boot过滤器FilterRegistrationBean - 稚语希听 - 博客园

 二:实战练习

1.管理员过滤器

    package com.imooc.mall.filter;
     
    import com.imooc.mall.common.ApiRestResponse;
    import com.imooc.mall.common.Constant;
    import com.imooc.mall.exception.ImoocMallExceptionEnum;
    import com.imooc.mall.model.pojo.Category;
    import com.imooc.mall.model.pojo.User;
    import com.imooc.mall.service.UserService;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    import javax.servlet.http.HttpSession;
    import org.springframework.beans.BeanUtils;
    import org.springframework.beans.factory.annotation.Autowired;
     
    /**
     * 描述:     管理员校验过滤器
     */
    public class AdminFilter implements Filter {
     
        @Autowired
        UserService userService;
     
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
     
        }
     
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpSession session = request.getSession();
            User currentUser = (User) session.getAttribute(Constant.IMOOC_MALL_USER);
            if (currentUser == null) {
                PrintWriter out = new HttpServletResponseWrapper(
                        (HttpServletResponse) servletResponse).getWriter();
                out.write("{\n"
                        + "    \"status\": 10007,\n"
                        + "    \"msg\": \"NEED_LOGIN\",\n"
                        + "    \"data\": null\n"
                        + "}");
                out.flush();
                out.close();
                return;
            }
            //校验是否是管理员
            boolean adminRole = userService.checkAdminRole(currentUser);
            if (adminRole) {
                filterChain.doFilter(servletRequest, servletResponse);
            } else {
                PrintWriter out = new HttpServletResponseWrapper(
                        (HttpServletResponse) servletResponse).getWriter();
                out.write("{\n"
                        + "    \"status\": 10009,\n"
                        + "    \"msg\": \"NEED_ADMIN\",\n"
                        + "    \"data\": null\n"
                        + "}");
                out.flush();
                out.close();
            }
        }
     
        @Override
        public void destroy() {
     
        }
    }

2.管理员过滤器配置

    package com.imooc.mall.config;
     
    import com.imooc.mall.filter.AdminFilter;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
     
    /**
     * 描述:     Admin过滤器的配置
     */
    @Configuration
    public class AdminFilterConfig {
     
        @Bean
        public AdminFilter adminFilter() {
            return new AdminFilter();
        }
     
        @Bean(name = "adminFilterConf")
        public FilterRegistrationBean adminFilterConfig() {
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
            filterRegistrationBean.setFilter(adminFilter());
            filterRegistrationBean.addUrlPatterns("/admin/category/*");
            filterRegistrationBean.addUrlPatterns("/admin/product/*");
            filterRegistrationBean.addUrlPatterns("/admin/order/*");
            filterRegistrationBean.setName("adminFilterConf");
            return filterRegistrationBean;
        }
    }




posted @ 2023-03-03 15:29  甜菜波波  阅读(2315)  评论(0编辑  收藏  举报