美文网首页Java相关互联网技术技术JavaEE
spring-boot使用教程(二):增加自定义filter(新

spring-boot使用教程(二):增加自定义filter(新

作者: 大黄蜂coder | 来源:发表于2016-07-10 22:14 被阅读31296次

    前言

    以往的javaEE增加Filter是在web.xml中配置,然而spring-boot中很明显不能这样实现,那怎么办呢?看完下面的教程,答案自然知道了。

    开源地址:https://github.com/bigbeef
    个人博客:http://blog.cppba.com

    前言

    传统的javaEE增加Filter是在web.xml中配置,如以下代码:

    <filter>
         <filter-name>TestFilter</filter-name>
            <filter-class>com.cppba.filter.TestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>TestFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <init-param>
           <param-name>paramName</param-name>
           <param-value>paramValue</param-value>
        </init-param>
    </filter-mapping>
    

    然而spring-boot中很明显不能这样实现,那怎么办呢?看完下面的教程,答案自然知道了。


    老方法(新方法请直接下拉)

    1.创建自定义Filter

    package com.cppba.filter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class TestFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
                throws IOException, ServletException {
            System.out.println("TestFilter");
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    2.在ApplicationConfiguration.java中增加一个@bean

     @Bean
        public FilterRegistrationBean testFilterRegistration() {
    
            FilterRegistrationBean registration = new FilterRegistrationBean();
            registration.setFilter(new TestFilter());
            registration.addUrlPatterns("/*");
            registration.addInitParameter("paramName", "paramValue");
            registration.setName("testFilter");
            registration.setOrder(1);
            return registration;
        }
    

    3.启动项目

    你会看到控制台打印如下代码:


    https://github.com/bigbeef/cppba-spring-boot

    4.访问项目

    最后我们访问以下http://127.0.0.1:8080/test
    如果你看到控制台打印出:TestFilter

    https://github.com/bigbeef/cppba-spring-boot
    恭喜你,配置成功!

    2017-04-20 最新spring-boot增加Filter方法

    首先定义一个Filter

    @Order(1)
    //重点
    @WebFilter(filterName = "testFilter1", urlPatterns = "/*")
    public class TestFilterFirst implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
                throws IOException, ServletException {
            System.out.println("TestFilter1");
            filterChain.doFilter(servletRequest,servletResponse);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    比较核心的代码是自定义类上面加上@WebFilter,其中@Order注解表示执行过滤顺序,值越小,越先执行

    我们在spring-boot的入口处加上如下注解@ServletComponentScan:

    @SpringBootApplication(scanBasePackages = "com.cppba")
    //重点
    @ServletComponentScan
    public class Application {
        public static void main(String[] args) throws UnknownHostException {
            SpringApplication app = new SpringApplication(Application.class);
            Environment environment = app.run(args).getEnvironment();
        }
    }
    

    这种方法效果和上面版本一样,但是用起来更加方便!

    相关文章

      网友评论

      • 053be058825f:非常感谢:+1:
      • nextliving:@Order注解没用
      • 2c1f2b8e36af:使用@WebFilter会执行两次,执行顺序如下
        filter
        biz
        filter
        请问是什么原因?
      • 陈旭员:楼主问你一个问题,为啥我的配置了urlPatterns = "/outernet/**" 还是所有的都过滤了。没有指定这个地址的过滤
        15e112cc46bf:@豆豆_3a41 您好,通过控制台日志查看确实是生成了两个filter,名字改成一样之后只生成了一个filter,但是还是能拦截所有的url
        豆豆_3a41:我也遇到了,弄了半天才发现,filterName 的值必须和@Component的值一致才可以!不然系统回产生2个过滤器,从而导致执行2遍
      • 7e384dcda573:我要嫁程序猿……
        陈旭员:我在这
        7e384dcda573: @大黄蜂coder 哈哈哈哈,做了才有得后悔,没做之前,你又如何得知……
        大黄蜂coder:@yeats1314 嫁给程序员你会后悔的
      • ulongx:楼主有试过多个sprint boot打包成一Jar?
        大黄蜂coder:@ulongx 用nginx吧
        ulongx: @大黄蜂coder 嗯~同一个公司开发了多个项,想合起来放同一个端口里
        大黄蜂coder:@ulongx 没试过 你有这个业务需求吗?

      本文标题:spring-boot使用教程(二):增加自定义filter(新

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