美文网首页
springBoot之切片拦截请求(使用filter)

springBoot之切片拦截请求(使用filter)

作者: 寂静的春天1988 | 来源:发表于2019-06-28 10:03 被阅读0次

    进入请求的前后,做一些事情。比如打印日志,或者校验数据合法等等。
    可以使用三种方式:

    一、使用filter

    filter类代码

    package com.ganlong.filter;
    
    import java.io.IOException;
    
    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 org.springframework.stereotype.Component;
    @Component
    public class TimeFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("初始化filter");
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest) request;
            String requestURI = req.getRequestURI();
            if (requestURI.contains("favicon.ico")) {
                return;
            }
            System.out.println("Filter开始");
            //进入下一个filter没有filter了则放行请求
            chain.doFilter(request, response);
            System.out.println("Filter结束");
        }
        @Override
        public void destroy() {
            System.out.println("filter销毁");
        }
    }
    

    总结:非常简单只需要实现一个filter接口实现三个方法,然后使用@Component方法注入spring容器即可

    上面是自己定义的filter,假如是第三方的库中的filter怎么假如过滤器链呢?可以使用@bean注入到容器中

    @Configuration
    public class WebConfig {
        @Bean
        public FilterRegistrationBean filterRegistrationBean() {
            FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
            //加入过滤器
            filterRegistrationBean.setFilter(new TimeFilter());
            //定义过滤器路径
            ArrayList<String> urlList=new ArrayList();
            urlList.add("/*");
            filterRegistrationBean.setUrlPatterns(urlList);
            return filterRegistrationBean;
        }
    }
    

    总结:注入一个FilterRegistrationBean ,将filter设置进filterRegistrationBean中然后可以设置过滤器的路径。

    注意:

    HttpServletRequest req = (HttpServletRequest) request;
    String requestURI = req.getRequestURI();
    if (requestURI.contains("favicon.ico")) {
        return;
    }
    

    在浏览器中测试过滤器时发现进入了过滤器两次,因为浏览器自己主动的又请求了一次图标静态资源,所以过滤器又拦截了一次。
    所以判断了一下请求图标静态资源时直接返回。

    相关文章

      网友评论

          本文标题:springBoot之切片拦截请求(使用filter)

          本文链接:https://www.haomeiwen.com/subject/mcovmqtx.html