SpringBoot 过滤器 filter 3种方法_spring boot filter 配置-程序员宅基地

技术标签: filter  spring  spring boot  java  Spring Boot  


前言

最近Spring Boot项目做单点登录对接的时候,在配置过滤器的时候,找了几种方法,记录一下。欢迎评论补充沟通~
由于之前JAVA Web项目最开始都有web.xml配置,随着框架慢慢的进化,从Spring Boot开始,已经没有了web.xml配置文件。
那原来在web.xml里,配置的filter过滤器,在Spring Boot中怎么配置呢?


一、3种配置Spring Boot过滤器的方法

  1. 实现Filter接口,使用@WebFilter注解

    过滤和实现都有,但是@order排序只能根据过滤器的类名排序

  2. 使用FilterRegistrationBean

    主要是过滤,实现类要单独写,可以自定义排序

  3. 实现ServletContextInitializer接口

    主要是过滤,实现类要单独写,目前没试能不能排序

二、web.xml的配置

<!-- 应用集成 开始 -->
  <!-- 单点登录过滤器-->
  <filter>
    <filter-name>SPDispacher</filter-name>
    <filter-class>org.xxx.SpFilterWrapper</filter-class>
  </filter>
  <!-- 客户端会话集成 -->
  <filter>
    <filter-name>SessionIntegrationFilter</filter-name>
    <filter-class>org.xxx.AgentSessionIntegrationFilter</filter-class>
  </filter>
  <!-- 访问控制器 -->
  <filter>
    <filter-name>AuthorizationFilter</filter-name>
    <filter-class>org.xxx.AgentAuthzBaseRoleFilter</filter-class>
  </filter>
  <!-- 应用集成 结束 -->
  
<!-- 应用集成 开始 -->
  <filter-mapping>
    <filter-name>SPDispacher</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>SPDispacher</filter-name>
    <url-pattern>/service/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>SPDispacher</filter-name>
    <url-pattern>/SAML2/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>SessionIntegrationFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>AuthorizationFilter</filter-name>
    <url-pattern>/service/*</url-pattern>
  </filter-mapping>
  <!-- 应用集成 结束 -->

三、Spring Boot过滤器方式1,使用@WebFilter注解

这种方式,可以在doFilter()方法中,写具体的过滤逻辑。
@WebFilter注解中写上属性,可以设置过滤的路径等等。
以上web.xml里的filter-class为已经封装好的第三方jar里的类。所以此处代码演示,与以上web.xml无关。

1.WebFilter的常用属性

在这里插入图片描述

属性名 类型 默认值 作用
filterName String “” 指定过滤器的 name 属性
value String[] {} 该属性等价于 urlPatterns 属性。两者不应该同时使用
urlPatterns String[] {} 指定一组过滤器的 URL 匹配模式
servletNames String[] {} 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中的取值
dispatcherTypes DispatcherType DispatcherType.REQUEST 指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST
initParams WebInitParam[] {} 指定一组过滤器初始化参数
asyncSupported boolean false 声明过滤器是否支持异步操作模式
description String “” 该过滤器的描述信息
displayName String “” 该过滤器的显示名,通常配合工具使用

2.使用方法

  1. 自定义类,实现 implements Filter接口。
  2. 自定义类,添加@WebFilter注解和属性。(这里我试了下,只写@WebFilter注解,不加任何属性,也能过滤全部的路径)
  3. 自定义类,不要加@Component或者@configuration注解。(这里有个坑,如果加了,设置的urlPatterns属性不好用,还是会过滤全部的)
  4. 启动类,添加@ServletComponentScan注解。(配合第3步,SpringBootApplication 上使用@ServletComponentScan 注解后,Filter可以直接通过@WebFilter注解自动注册)

备注:自定义类上,可以设置过滤器的顺序@Order(1),这个网上说不好用,还是根据过滤器类名排序的。

3.代码演示

代码如下:

package org.framework.modules.system.paramsUtil;

import com.alibaba.fastjson.JSONObject;
import org.framework.common.util.encryption.AesEncryptUtil;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;

@WebFilter(urlPatterns = "/*")
// @WebFilter(filterName = "testFilter", urlPatterns = "/*", 
//        initParams = @WebInitParam(name = "noFilterUrl", value = "/test"))
public class ParamsFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
    	// TODO 此处写具体的处理逻辑
        ServletRequest requestWrapper = null;
        HashMap paramsOld = new HashMap(request.getParameterMap());
        if(!ObjectUtils.isEmpty(paramsOld)){
    
            JSONObject json = (JSONObject) JSONObject.toJSON(paramsOld);
            if(json.containsKey("xxxcryptparams")){
    
                try {
    
                    String ss = json.getString("xxxencryptparams");
                   	...
                } catch (Exception e) {
    
                    e.printStackTrace();
                }
                if(request instanceof HttpServletRequest) {
    
                    requestWrapper = new RequestWrapper((HttpServletRequest) request,json);
                }
            }
        }
        if(requestWrapper == null) {
    
            chain.doFilter(request, response);
        } else {
    
            chain.doFilter(requestWrapper, response);
        }
    }

    @Override
    public void destroy() {
    

    }
}
@SpringBootApplication
@ServletComponentScan
public class JeecgApplication {
    

  public static void main(String[] args) {
    
  ...
  }
}

四、Spring Boot过滤器方式2,使用FilterRegistrationBean

这种方式,适合过滤器的具体类已经写好的情况,这里做一下拦截。
可以自定义类,也可以是导入第三方的jar写好的类。

1.自定义类演示

注意,这个自定义类,也不能加@Component或@Configuration注解,加了就会初始化Filter了,过滤全部的路径了。

package org.framework.modules.system.paramsUtil;

import javax.servlet.*;
import java.io.IOException;

public class ParamsFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
    	// TODO 过滤器逻辑
         chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    

    }
}

@Bean
public FilterRegistrationBean<OrderFilter> orderFilter() {
    
    FilterRegistrationBean<OrderFilter> filter = new FilterRegistrationBean<>();
    filter.setName("paramsFilter");
    filter.setFilter(new ParamsFilter());
    // 指定优先级
    filter.setOrder(-1);
    return filter;
}

2.第三方jar演示

与web.xml配套:

package org.framework.modules.bsp.filter;

import org.xxx.AgentAuthzBaseRoleFilter;
import org.xxx.AgentSessionIntegrationFilter;
import org.xxx.SpFilterWrapper;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;

@Configuration
public class MyBspFilter {
    
    /**
     * 注册registerSPDispacher
     */
    @Bean
    public FilterRegistrationBean registerSPDispacher() {
    
        FilterRegistrationBean registration  = new FilterRegistrationBean();

        registration.setFilter(new SpFilterWrapper());
        registration.addUrlPatterns(new String[] {
    "*.jsp","/service/*","/SAML2/*"});
        registration.setName("SPDispacher");
        registration.setOrder(1);  //值越小,Filter越靠前。

        return registration;
    }

    /**
     * 注册SessionIntegrationFilter
     */
   @Bean
    public FilterRegistrationBean registerSessionIntegrationFilter() {
    
        FilterRegistrationBean registration  = new FilterRegistrationBean();

        registration.setFilter(new AgentSessionIntegrationFilter());
        registration.addUrlPatterns("/*");
        registration.setName("SessionIntegrationFilter");
        registration.setOrder(2);  //值越小,Filter越靠前。

        return registration;
    }

    /**
     * 注册SessionIntegrationFilter
     */
    @Bean
    public FilterRegistrationBean registerAuthorizationFilter() {
    
        FilterRegistrationBean registration  = new FilterRegistrationBean();

        registration.setFilter(new AgentAuthzBaseRoleFilter());
        registration.addUrlPatterns("/service/*");
        registration.setName("AuthorizationFilter");
        registration.setOrder(3);  //值越小,Filter越靠前。

        return registration;
    }
}

五、Spring Boot过滤器方式3,实现ServletContextInitializer接口

这种方式,适合过滤器的具体类已经写好的情况,这里做一下过滤。
可以自定义类,也可以是导入第三方的jar写好的类。此处以与web.xml配套的第三方jar演示。

1.代码演示

与web.xml配套:

package org.framework.modules.bsp.filter;

import org.xxx.AgentAuthzBaseRoleFilter;
import org.xxx.AgentSessionIntegrationFilter;
import org.xxx.service.SpFilterWrapper;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Configuration;

import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;

@Configuration
public class MyWebApplicationInitializer implements ServletContextInitializer {
    
    @Override
    public void onStartup(ServletContext sc) throws ServletException {
    
        FilterRegistration.Dynamic sPDispacher = sc.addFilter("SPDispacher", SpFilterWrapper.class);
        sPDispacher.addMappingForUrlPatterns(null, false, "*.jsp");
        sPDispacher.addMappingForUrlPatterns(null, false, "/service/*");
        sPDispacher.addMappingForUrlPatterns(null, false, "/SAML2/*");

        FilterRegistration.Dynamic sessionIntegrationFilter = sc.addFilter("SessionIntegrationFilter", AgentSessionIntegrationFilter.class);
        sessionIntegrationFilter.addMappingForUrlPatterns(null, false, "/*");


        FilterRegistration.Dynamic authorizationFilter = sc.addFilter("AuthorizationFilter", AgentAuthzBaseRoleFilter.class);
        authorizationFilter.addMappingForUrlPatterns(null, false, "/service/*");
    }
}


总结

这3中方式,都是测过够写出来的。我最终使用的是 FilterRegistrationBean 方式。如果以后对顺序有要求,可以灵活的修改。v:wang13191319

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bzu_mei/article/details/126644963

智能推荐

前端设置条件限制form表单提交到后端解决方案_jsp前端页面将表单是否提交成功作为限制条件-程序员宅基地

文章浏览阅读375次。<script src="js/jquery-1.8.3.min.js" type="text/javascript"></script> <script type="text/javascript"> function checkName() { var name = document.getElementB..._jsp前端页面将表单是否提交成功作为限制条件

计算机网络sequence number,TCP协议中SequenceNumber和Ack Numbe-程序员宅基地

文章浏览阅读1k次。Sequence Numberlzyws7393074532892018-04-25Number Sequenceqq_391789932452017-09-21理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)hebbely9822017-01-14Number Sequence(规律)l25336363712902017-07-18Numb..._ack num

计算机系统启动项设置密码,电脑开机第一道密码怎么设置 - 卡饭网-程序员宅基地

文章浏览阅读5.9k次。笔记本电脑怎么进CMOS密码巧设置笔记本电脑怎么进CMOS密码巧设置 笔记本电脑为了保护用户的数据安全,往往采用加密的方式,最常见的还是CMOS密码加密技术。为了让你的重要数据更加安全,你可能需要设置不同的密码,这也就要求你记住许多密码。对于笔记本电脑用户来说,真的需要设置一道道密码关卡吗?非也非也! 一、认识与设置笔记本电脑的CMOS密码 笔记本电脑的CMOS密码大致分为超级密码(Supervi..._电脑第一道密码修改

VulnHub靶机-Jangow: 1.0.1_jangow01-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏5次。迟到的文章,就当库存发出来吧~_jangow01

spark实战之RDD的cache或persist操作不会触发transformation计算_spark cache和persist不生效-程序员宅基地

文章浏览阅读1.7w次,点赞2次,收藏5次。默认情况下RDD的transformation是lazy形式,实际计算只有在ation时才会进行,而且rdd的计算结果默认都是临时的,用过即丢弃,每个action都会触发整个DAG的从头开始计算,因此在迭代计算时都会想到用cache或persist进结果进行缓存。敝人看到很多资料或书籍有的说是persist或cache会触发transformation真正执行计算,有的说是不会!敝人亲自实验了一把..._spark cache和persist不生效

html文字滚动_html滚动-程序员宅基地

文章浏览阅读2.4k次。HTML之marquee(文字滚动)详解语法:以下是一个最简单的例子:代码如下:Hello, World下面这两个事件经常用到:onMouseOut=“this.start()” :用来设置鼠标移出该区域时继续滚动onMouseOver=“this.stop()”:用来设置鼠标移入该区域时停止滚动代码如下:onMouseOut=“this.start()” :用来设置鼠标移出该区域时继续滚动 onMouseOver=“this.stop()”:用来设置鼠标移入该区域时停止滚动这是一个完_html滚动

随便推点

信号发生器设计VHDL代码Quartus仿真_vhdl正弦波信号发生器-程序员宅基地

文章浏览阅读1k次,点赞20次,收藏22次。代码功能:信号发生器设计信号发生器由波形选择开关控制波形的输出,分别能输出正弦波、方汉和三角波三种波形,波形的周期为2秒(由40M有源晶振分频控制)。考虑程序的容量,每种波形在一个周期内均取16个取样点,每个样点数据是8位(数值范围:00000000~1111111)要求将D/A变换前的8位二进数据(以十进制方式)输出到数码管动态演示出来。_vhdl正弦波信号发生器

笔记-Java线程概述_java 线程概述-程序员宅基地

文章浏览阅读629次。Java Concurrency in Practice中对线程安全的定义:当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替运行,并且不需要额外的同步及在调用方代码不必做其他的协调,这个类的行为仍然是正确的,那么这个类就是线程安全的。显然只有资源竞争时才会导致线程不安全,因此无状态对象永远是线程安全的 。过多的同步会产生死锁的问题,死锁属于程序运行的时_java 线程概述

MATLAB从文件读取数据_matlab读取数据-程序员宅基地

文章浏览阅读1.2w次,点赞10次,收藏61次。读取表单Sheet2中部分信息。_matlab读取数据

【实践】基于spark的CF实现及优化_spark cf-程序员宅基地

文章浏览阅读1.4w次。最近项目中用到ItemBased Collaborative Filtering,实践过spark mllib中的ALS,但是因为其中涉及到降维操作,大数据量的计算实在不能恭维。所以自己实践实现基于spark的分布式cf,已经做了部分优化。目测运行效率还不错。以下代码package modelimport org.apache.spark.broadcast.Broadcastimp_spark cf

ijkplayer直播播放器使用经验之谈——卡顿优化和秒开实现_libijkplayer 播放直播流卡顿-程序员宅基地

文章浏览阅读1.8w次。 在我的博客移动平台播放器ijkplayer开源框架分析(以IOS源码为例),大致介绍了一下ijkplayer的基本函数调用顺序和主要线程作用,本博客想介绍一下在直播应用中,针对卡顿和秒开做的一些优化,本优化经验主要是用在Android系统上,ios上也可以借鉴,按本博客修改代码,网络带宽足够的情况下,音视频播放基本流畅不卡顿,首屏时间在500ms以内。 首先来看直播应用中的卡顿。直..._libijkplayer 播放直播流卡顿

数据挖掘实践(金融风控-贷款违约预测)(三):特征工程_金融风控(大数据)特征工程-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏28次。数据挖掘实践(金融风控-贷款违约预测)(三):特征工程目录数据挖掘实践(金融风控-贷款违约预测)(三):特征工程1.引言2.特征预处理2.1缺失值填充2.2时间格式处理2.3类别特征处理3.异常值处理3.1 检测异常的方法一:正态分布法3.2 检测异常的方法二:箱型图3.3异常值的处理方法4.数据分桶5.特征交互6.特征编码6.1 labelEncode 直接放入树模型中6.2 逻辑回归等模型要单独增加的特征工程7.特征选择7.1 Filter7.2 Wrapper (Recursive feature _金融风控(大数据)特征工程

推荐文章

热门文章

相关标签