Spring Boot之FilterRegistrationBean-自定义Filter详解

Spring Boot之FilterRegistrationBean-自定义Filter

项目老的用spring写的,新的升级到了springboot,原代码中有在web.xml中定义过滤器,在boot中,自然没法这样用了,因而看了看boot如何使用自定义过滤器。

在springboot 中,主要是靠FilterRegistrationBean 这个类来提供这样的功能。

自定义 Filter

我们常常在项目中会使用 filters 用于录调用日志、排除有 XSS 威胁的字符、执行权限验证等等。Spring Boot 自动添加了 OrderedCharacterEncodingFilter 和 HiddenHttpMethodFilter,并且我们可以自定义 Filter。

两个步骤:

  • 1、实现 Filter 接口,实现 Filter 方法
  • 2、添加 @Configuration 注解,将自定义Filter加入过滤链

好吧,直接上代码

package com.zoo.lion.modules.test.test;
import org.apache.catalina.filters.RemoteIpFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @Author: xf
 * @Date: 2019/7/16 13:39
 * @Version 1.0
 */
@Configuration
public class WebConfiguration {

    @Bean
    public RemoteIpFilter remoteIpFilter() {
        return new RemoteIpFilter();
    }

    @Bean
    public FilterRegistrationBean<MyFilter> testFilterRegistration() {
        FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new MyFilter());
        //过滤应用程序中所有资源,当前应用程序根下的所有文件包括多级子目录下的所有文件,注意这里*前有“/”
        registration.addUrlPatterns("/*");
        //过滤指定的类型文件资源, 当前应用程序根目录下的所有html文件,注意:*.html前没有“/”,否则错误
        registration.addUrlPatterns(".html");
        //过滤指定的目录下的所有文件,当前应用程序根目录下的folder_name子目录(可以是多级子目录)下所有文件
        registration.addUrlPatterns("/folder_name/*");
        //过滤指定文件
        registration.addUrlPatterns("/index.html");

        registration.addInitParameter("paramName", "paramValue");
        registration.setName("MyFilter");
        registration.setOrder(1);
        return registration;
    } 

    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) {

        }

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request2 = (HttpServletRequest) request;
            System.out.println(request2.getRequestURI());
            chain.doFilter(request, response);
        }

        @Override
        public void destroy() {
        }
    }
}

SpringBoot FilterRegistrationBean对象支持web的filter的排序

1.FilterRegistrationBean对象可以实现对web Filter的排序,使用setOrder(int i)方法

具体代码如下:

package com.dbzhang;
/**
 * @author zdb
 * @description @Configuration和@Bean注解配置使用,就相当于在配置文件中配置bean的注解式用法
 */
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.apache.catalina.filters.RemoteIpFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfiguration {
	@Bean
	public RemoteIpFilter remoteIpFilter(){
		return new RemoteIpFilter();
	}
	/***
	 * 这个FilterRegistrationBean类可以使用setOrder()方法实现对filter的排序,然后在进行注册
	 * https://blog.csdn.net/doctor_who2004/article/details/56055505
	 */
	public FilterRegistrationBean testFilterRegistration(){
		FilterRegistrationBean registration = new FilterRegistrationBean();
		registration.setFilter(new MyFilter());
		registration.addUrlPatterns("/*");
		registration.addInitParameter("paramName", "paramValue");
		registration.setName("MyFilter");
		registration.setOrder(1);
		return registration;
	}
	/**
	 *
	 * @author zdb
	 * @description 这个是用来实现Filter
	 *
	 */
	public class MyFilter implements Filter{
		@Override
		public void destroy() {
		}

		@Override
		public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
				throws IOException, ServletException {
			HttpServletRequest request = (HttpServletRequest)servletRequest;
			System.out.println("this is MyFilter,url:"+request.getRequestURI());
			filterChain.doFilter(servletRequest, servletResponse);
		}

		@Override
		public void init(FilterConfig arg0) throws ServletException {
		}
	}
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot中使用Filter和Interceptor的示例代码

    一.Filter(过滤器) Filter接口定义在javax.servlet包中,是Servlet规范定义的,作用于Request/Response前后,被Servlet容器调用,当Filter被Sring管理后可以使用Spring容器资源. 实现一个Filter 自定义的过滤器需要实现javax.servlet.Filter,Filter接口中有三个方法: init(FilterConfig filterConfig):过滤器初始化的被调用. doFilter(ServletRequest s

  • spring boot过滤器FilterRegistrationBean实现方式

    有2种方式可以实现过滤器 1:通过FilterRegistrationBean实例注册 2:通过@WebFilter注解生效 这里选择第一种,因为第二种不能设置过滤器之间的优先级 为了演示优先级,这里创建2个测试过滤器类:Test1Filter.Test2Filter 通过实现javax.servlet.Filter接口,覆盖其doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)方法,决定拦截或放行 publi

  • SpringBoot 2 快速整合 Filter过程解析

    概述 SpringBoot 中没有 web.xml, 我们无法按照原来的方式在 web.xml 中配置 Filter .但是我们可以通过 JavaConfig(@Configuration +@Bean)方式进行配置.通过FilterRegistrationBean 将自定义 Filter 添加到 SpringBoot 的过滤链中. 实战操作 实战操作通过定义一个拦截所有访问项目的URL的 Filter来进行演示的. 首先定义一个统一访问 URL 拦截的 Filter.代码如下: public

  • spring-boot实现增加自定义filter(新)

    前言 传统的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-n

  • Spring Boot之FilterRegistrationBean-自定义Filter详解

    Spring Boot之FilterRegistrationBean-自定义Filter 项目老的用spring写的,新的升级到了springboot,原代码中有在web.xml中定义过滤器,在boot中,自然没法这样用了,因而看了看boot如何使用自定义过滤器. 在springboot 中,主要是靠FilterRegistrationBean 这个类来提供这样的功能. 自定义 Filter 我们常常在项目中会使用 filters 用于录调用日志.排除有 XSS 威胁的字符.执行权限验证等等.S

  • Spring Boot 注解方式自定义Endpoint详解

    目录 概述 准备 编写自定义Endpoint 配置 启动&测试 注意 Spring Boot 常用endpoint的使用 Actuator 一些常用 Endpoint 如何访问 Actuator Endpoint 概述 在使用Spring Boot的时候我们经常使用actuator,健康检查,bus中使用/refresh等.这里记录如何使用注解的方式自定义Endpoint.可用于满足一些服务状态监控,或者优雅停机等. 准备 Spring Boot项目,pom中加入: <dependency&

  • spring boot(四)之thymeleaf使用详解

    在上篇文章springboot(二):web综合开发中简单介绍了一下thymeleaf,这篇文章将更加全面详细的介绍thymeleaf的使用.thymeleaf 是新一代的模板引擎,在spring4.0中推荐使用thymeleaf来做前端模版引擎. thymeleaf介绍 简单说, Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: 1.Thymeleaf 在有网络和无网络的环境下皆可

  • Spring boot跨域设置实例详解

    定义:跨域是指从一个域名的网页去请求另一个域名的资源 1.原由 公司内部有多个不同的子域,比如一个是location.company.com ,而应用是放在app.company.com , 这时想从 app.company.com去访问 location.company.com 的资源就属于跨域 本人是springboot菜鸟,但是做测试框架后端需要使用Springboot和前端对接,出现跨域问题,需要设置后端Response的Header.走了不少坑,在这总结一下以备以后使用 2.使用场景

  • Spring boot的上传图片功能实例详解

    简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 特点 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自动配置Spring 5. 提

  • Spring Boot整合EhCache的步骤详解

    本文讲解Spring Boot与EhCache的整合. 1 EhCache简介 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点. 2 Spring Boot整合EhCache步骤 2.

  • Spring boot Thymeleaf配置国际化页面详解

    目录 1.编写多语言国际化配置文件 2.编写配置文件 3.定制区域信息解析器 4.页面国际化使用 5.整合效果测试 1.编写多语言国际化配置文件 在项目的类路径resources下创建名称为i18n的文件夹,并在该文件夹中根据需要编写对应的多语言国际化文件login.properties.login_zh_CN.properties和login_en_US.properties文件 login.properties login.tip=请登录login.username=用户名login.pas

  • Spring boot admin 服务监控利器详解

    目录 一.简介 二.搭建 1.服务端 2.客户端 3.启动项目 4.客户端配置 3.微服务 3.1.服务端 3.2.客户端 4.我的微服务预警发送其他服务状态信息思路 一.简介 用于对 Spring Boot 应用的管理和监控.可以用来监控服务是否健康.是否在线.以及一些jvm数据等等.Spring Boot Admin 分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client),服务端和客户端之间采用 http 通讯方式实现数据交

  • Spring Boot实现功能的统一详解

    目录 1. 统一用户登录权限验证 1.1 自定义拦截器 1.2 将自定义拦截器加入到系统配置 1.3 运行结果 1.4 总结 2. 统一异常处理 2.1 代码实现 2.2 运行结果 3. 统一数据返回格式 3.1 代码实现 3.2 运行结果 1. 统一用户登录权限验证 拦截器的实现分为两步: 创建自定义拦截器, 实现 HandlerInterceptor 接口并重写 preHandle 方法 配置拦截器和拦截规则, (将自定义拦截器加入 WebMvcConfigurer 的 addInterce

  • spring boot的maven配置依赖详解

    本文介绍了spring boot的maven配置依赖详解,分享给大家,具体如下: 我们通过引用spring-boot-starter-parent,添加spring-boot-starter-web 可以实现web项目的功能,当然不使用spring-boot-start-web,通过自己添加的依赖包也可以实现,但是需要一个个添加,费时费力,而且可能产生版本依赖冲突.我们来看下springboot的依赖配置: 利用pom的继承,一处声明,处处使用.在最顶级的spring-boot-dependen

随机推荐