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

智能推荐

我们应如何度过自己的大学生活?_如何度过大学生活1000字-程序员宅基地

文章浏览阅读3.1k次。我们应如何度过自己的大学生活?  踏着九月的烈日,我们成功地来到了河南理工大学,开始了我们的大学生活,那么你可曾想过,我们到底应该如何度过我们的大学生活才算有意义呢?  可曾记得高中老师说的最多的一句话:“好好学吧!上了大学就轻松了!”每当听到这句话时都会给我们莫大的鼓励,也让我们对大学充满了憧憬。那么大学生活真如高中老师说的那样轻松吗?其实不然!高中老师所谓的轻松只是在一定程度上正课的时..._如何度过大学生活1000字

python snownlp情感分析简易demo(分享),没有我Python干不成的事!_snowlp情感分析代码-程序员宅基地

文章浏览阅读745次。SnowNLP是国人开发的python类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。MIT许可下发行。其github主页可能有些不准确,我也是随便提取的数据,不过snownlp还是号称情感分析准确很高的!_snowlp情感分析代码

命令行安装todesk_todesk命令行csdn-程序员宅基地

文章浏览阅读653次,点赞10次,收藏7次。要想通过命令行安装todesk,也是比较简单的。_todesk命令行csdn

如何开发一个个人微信小程序,微信小程序开发入门教程_微信小程序怎么开发自己的小程序-程序员宅基地

文章浏览阅读10w+次,点赞183次,收藏1.1k次。做任何程序开发要首先找到其官方文档,我们先来看看其有哪些官方文档。微信小程序开发文档链接为:https://mp.weixin.qq.com/debug/wxadoc/dev/index.html,如下图:这里就是做微信小程序开发的全部官方文档。知道了文档的位置,下面我们来介绍下如何做一个微信小程序开发:第一步:下载微信小程序开发者工具并安装,下载路径:https://mp.weix..._微信小程序怎么开发自己的小程序

前端解决浏览器直接打开图片URL,下载问题_前端想要通过url下载但是打开了网页-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏7次。本周做的项目中有一个下载图片的功能,拿到后台返回的url,像文件一样,直接window.open,发现图片没有像文件一样被下载,而是重新打开了一个页面展示图片。然后我尝试了转成base64等方法也还是有跨域的问题。后来就想着自己把这个url,发送给Node,node转成数据流返回给我,我再下载。话不多说,上代码:vue前端代码: downZip (urls) { ..._前端想要通过url下载但是打开了网页

什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?_成员内部类和局部内部类的区别-程序员宅基地

文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别

随便推点

语义分割入门的总结-程序员宅基地

文章浏览阅读740次。点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达作者:Yanpeng Sunhttps://zhuanlan.zhihu.com/p/74318967声明:仅做学术分..._语义分割两个目标重合怎么

SpringBoot实践(三十五):JVM信息分析_怎样查看springboot项目的jvm状态-程序员宅基地

文章浏览阅读902次。JVM分析可以也可以使用,那么什么时候用到jvm信息分析呢,一般生产测试环境,能够最大化将问题暴露,但是总有些问题只有生产运行很长时间后才会被发现,jvm分析经常用于运行了很久的系统有异常情况时的调优,比如堆内存本身分配不合理,新生代中eden比例太低等。_怎样查看springboot项目的jvm状态

基于springboot+vue的戒毒所人员管理系统 毕业设计-附源码251514_戒毒所管理系统-程序员宅基地

文章浏览阅读288次。戒毒所人员管理系统的开发是采用java语言,基于MVVM模式进行开发,采取MySQL作为后台数据的主要存储单元,采用Springboot框架实现了本系统的全部功能。戒毒所人员管理系统,具有戒毒人员管理、尿检管理、戒毒管理、治疗分类、社会跟踪等功能,本系统代码的复用率高,系统维护代价小,具有方便、灵活、高效等特征。_戒毒所管理系统

【LeetCode】面试题57 - II. 和为s的连续正数序列_leet code 和为s的正数序列 java-程序员宅基地

文章浏览阅读174次。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof题目描述:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9..._leet code 和为s的正数序列 java

java spark的使用和配置_使用java调用spark注册进去的程序-程序员宅基地

文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序

汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用_uds协议栈 源代码-程序员宅基地

文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码