Spring Security和自定义filter的冲突导致多执行的解决方案

当使用 Spring Security 的时候,如果我们自己也使用了自定义的过滤器 Filter,可能会导致一个问题就是会执行多次 Filter 过滤器链,我们应该如何解决这个问题呢?

通常情况下 Filter 是在 Spring Security 的过滤器链之前执行的,这就会导致在接收到请求时,先执行我们自定义的过滤器,然后再执行 Spring Security 的过滤器,又再次执行我们自己的过滤器。

为了解决这个问题,我们需要在 Spring Security 的配置文件中进行配置,指定哪些过滤器需要跳过,防止多次执行。

具体的解决方案如下:

1.在 Spring Security 的配置文件中,指定自定义 Filter 需要跳过的过滤器

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Autowired
  private CustomFilter customFilter;

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
  }
}

在这个例子中,我们使用了 addFilterBefore 方法来指定 customFilter 之前需要跳过的过滤器,这里我们指定了 UsernamePasswordAuthenticationFilter,这表示在执行 Spring Security 过滤器链时,会跳过这个过滤器,从而避免了多次执行。

2.在自定义的 Filter 中加入判断,若已经执行过,直接返回,避免多次执行

public class CustomFilter extends OncePerRequestFilter {

  private boolean hasExecuted = false;

  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    if (hasExecuted) {
      filterChain.doFilter(request, response);
      return;
    }
    //do filter logic here

    hasExecuted = true;
  }
}

在这个例子中,我们使用一个 boolean 类型的变量 hasExecuted 来标识 Filter 是否已经执行过,若已执行,则直接返回,不再执行逻辑。在这种情况下,我们可以使用 OncePerRequestFilter 类型的过滤器,确保每次请求只会执行一次 doFilterInternal 方法。

总结一下,解决 Spring Security 和自定义 Filter 冲突导致多执行的问题,可以通过指定自定义 Filter 需要跳过的过滤器和在自定义 Filter 中加入判断,若已执行过则直接返回来避免多次执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Security和自定义filter的冲突导致多执行的解决方案 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java中使用session监听实现同帐号登录限制、登录人数限制

    Java中使用Session监听器可以很好地实现同账号登录限制和登录人数限制的功能。以下是实现这一功能的完整攻略: 一、实现同账号登录限制 1.编写Session监听器 在Web项目中的WEB-INF目录下新建一个名为session的包,并在包中新建一个Java类SessionListener。下面是一个参考示例: package session; impo…

    Java 2023年6月16日
    00
  • java static块和构造函数的实例详解

    Java中的static块和构造函数都是用来初始化类的成员变量的,但两者有着不同的特点和应用场景。下面详细讲解static块和构造函数的用法及其区别。 一、static块 1.1 定义 在Java中,static块是一个静态代码块,用来初始化静态成员变量。在类加载时,如果类中有static块,则首先会执行static块,然后才会执行其他代码块和构造函数。 1…

    Java 2023年5月26日
    00
  • 关于Spring中声明式事务的使用详解

    关于Spring中声明式事务的使用详解 什么是声明式事务? 在Spring中,事务是指一组需要保证数据完整性和一致性的数据库操作。 在进行事务处理时,必须保证多个操作的原子性,即所有操作都能够全部成功或全部失败。 Spring中的声明式事务是基于AOP实现的,通过对方法进行拦截,在方法执行前后加上事务的开始和结束语句,来实现事务的管理。这样即使开发人员忘记在…

    Java 2023年5月19日
    00
  • JDBC插入数据返回数据主键代码实例

    下面就是“JDBC插入数据返回数据主键”完整攻略,包含以下内容: 概述 实现步骤 示例1:直接使用Statement执行插入操作并返回主键 示例2:使用PreparedStatement预编译执行插入操作并返回主键 1. 概述 在开发中,我们经常需要在数据库中插入数据,并获取插入后的数据主键值。JDBC 提供了两种方式来执行插入操作并返回主键:直接使用 St…

    Java 2023年5月20日
    00
  • SpringBoot导出Word文档的三种方式

    SpringBoot导出Word文档的三种方式 一、导出方案 1、直接在Java代码里创建Word文档,设置格式样式等,然后导出。(略) 需要的见:https://blog.csdn.net/qq_42682745/article/details/120867432 2、富文本转换后的HTML下载为Word文档。相当于把HTML转为Word导出 3、使用模板…

    Java 2023年5月4日
    00
  • java随机字符串生成示例

    当我们需要在Java应用程序中生成随机字符串时,可以使用Java中的Random类来实现。下面是一个完整的Java随机字符串生成示例攻略: 1. 导入Random类 import java.util.Random; 2. 定义随机生成字符串的方法 public static String generateRandomString(int length) { …

    Java 2023年5月26日
    00
  • java实现模仿斗地主发牌

    讲解“Java实现模仿斗地主发牌”的完整攻略,可以分为以下几个步骤: 1. 创建扑克牌对象 为了模仿斗地主发牌,我们需要先创建一副扑克牌的对象。扑克牌通常包含四种花色:方块、梅花、红桃、黑桃;每种花色又有十三种不同的点数,即从 A 到 K 共 13 种。 创建一个 Card 类来表示一张扑克牌,包含属性 suit(花色)和 rank(点数),以及 toStr…

    Java 2023年5月23日
    00
  • Spring Boot JPA访问Mysql示例

    下面我详细讲解一下Spring Boot JPA访问Mysql的完整攻略,包含以下几个步骤: 1. 创建Spring Boot项目 首先要创建一个Spring Boot项目,你可以使用官方的Spring Initializr来快速创建一个基础框架。选择Maven或Gradle项目管理方式和需要的依赖,例如: Spring Web Spring Data JP…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部