美文网首页技术Spring Boot程序员
Spring Boot:定制servlet filters

Spring Boot:定制servlet filters

作者: 程序熊大 | 来源:发表于2015-12-07 14:31 被阅读13212次

    在实际的web应用程序中,经常需要在请求(request)外面增加包装用于:记录调用日志、排除有XSS威胁的字符、执行权限验证等等。除了上述提到的之外,Spring Boot自动添加了OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,并且我们在自己的项目中还可以增加别的过滤器。

    Spring Boot、Spring Web和Spring MVC等其他框架,都提供了很多servlet 过滤器可使用,我们需要在配置文件中定义这些过滤器为bean对象。现在假设我们的应用程序运行在一台负载均衡代理服务器后方,因此需要将代理服务器发来的请求包含的IP地址转换成真正的用户IP。Tomcat 8 提供了对应的过滤器:RemoteIpFilter。通过将RemoteFilter这个过滤器加入过滤器调用链即可使用它。

    How Do

    一般在写简单的例子时,不需要单独定义配置文件,只需要将对应的bean对象定义在Application类中即可。正式的项目中一般会有单独的web配置文件,我们在项目的com.test.bookpub(与BookpubApplication.java同级)下建立WebConfiguration.java文件,并用@Configuration注解修饰。

    package com.test.bookpub;
    
    import org.apache.catalina.filters.RemoteIpFilter;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class WebApplication {
        @Bean
        public RemoteIpFilter remoteIpFilter() {
            return new RemoteIpFilter();
        }
    }
    

    通过mvn spring-boot:run启动项目,可以在终端中看到如下的输出信息,证明RemoteIPFilter已经添加成功。

    RemoteIPFilter

    分析

    项目的主类——BookPubApplication,可以看到由@SpringBootApplication注解修饰,这包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。在Spring Boot的自动配置、Command-line Runner一文中曾对这个三个注解做详细解释,@ComponentScan让Spring Boot扫描到WebConfiguration类并把它加入到程序上下文中,因此,我们在WebApplication中定义的Bean就跟在BookPubApplication中定义一样。

    方法@Bean public RemoteIpFilter remoteIpFilter() { ... }返回一个RemoteIPFilter类的spring bean。当Spring Boot监测到有javax.servlet.Filter的bean时就会自动加入过滤器调用链。从上图中还可以看到,该Spring Boot项目一次加入了这几个过滤器:characterEncodingFilter(用于处理编码问题)、hiddenHttpMethodFilter(隐藏HTTP函数)、httpPutFormContentFilter、requestContextFilter(请求上下文),以及我们刚才自定义的RemoteIPFilter。

    所有过滤器的调用顺序跟添加的顺序相反,过滤器的实现是责任链模式,具体的原理分析可以参考:责任链模式

    相关文章

      网友评论

      • Muscleape:个人理解:还望指教
        楼主的文章最后提到“过滤器的调用顺序跟添加的顺序相反”,这个貌似是有误吧。FilterRegistrationBean有个属性Order,默认值是“Integer.MAX_VALUE”,通过使用setOrder()方法或者是使用@Order注解的方式指定Order属性值,值越小,过滤器执行的优先级越高;
      • 2e2b41df33bb:看国外书籍需要什么样的英语水平
        程序熊大:@158498391 4级就OK了,多看多查就好
      • 木叶之荣:过滤器的执行顺序和添加顺序相同,不是相反。
        Muscleape:同意,是通过setOrder()指定的顺序,这里指定的顺序值越小,执行的优先级越高
      • 饭盒君:*how to do
        不是 how do
        搁浅的双鱼:汉化的英文 怎么做 和怎么去做 :smiley:
      • 8fd687d4c7c5:RemoteIpFilter类是怎样的啊?
      • tkec:怎么能让spring boot 把用@Bean标记的的filter,不自动的加入到filterchain中,仅作为普通bean?
      • d119b8abb9fc:hiddenHttpMethodFilter是为了支持GET、POST、PUT与DELETE请求的。
        httpPutFormContentFilter是获取PUT表单请求数据的另外一种方法
      • zjunothing:看了几篇,基本上是原书的内容照搬吧。 还有不理解这个 how do 是啥意思 (how to ?)
        Muscleape:@JJZHK 使用这个标签是为了让springboot知道这个类是一个配置类,springboot会注册这个类
        d119b8abb9fc:为何RemoteIpFilter 所属的类,要用@Configuration来修饰哩?
        程序熊大: @zjunothing 读书笔记啦,意思是实践或者例子
      • Devid:不错
        程序熊大:@Devid 谢谢你的肯定 :smiley:

      本文标题:Spring Boot:定制servlet filters

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