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日

相关文章

  • springboot连接不同数据库的写法详解

    下面是“Spring Boot连接不同数据库的写法详解”的完整攻略。 1. 引入对应的数据库依赖 在使用Spring Boot连接不同的数据库时,需要根据使用的数据库引入对应的依赖。 MySQL xml<dependency> <groupId>mysql</groupId> <artifactId>mysql…

    Java 2023年5月20日
    00
  • Java EE实现用户后台管理系统

    听起来您需要了解如何使用Java EE实现用户后台管理系统的攻略,下面是一些基本步骤: 1. 确定需求和功能 在开发用户后台管理系统之前,首先需要明确系统的功能和需求。例如,您需要确定用户是否需要注册,登陆,管理数据等功能需求。这些需求和功能可以形成您设计和开发系统的蓝图。 2. 选择合适的框架 选择适合您的开发需求的框架是非常重要的。Java EE中有很多…

    Java 2023年5月19日
    00
  • java-servlet-转发AND路径(详解)

    下面是对应的完整攻略: Java Servlet 转发和路径详解 什么是 Servlet 转发? Servlet 转发是指一个 Servlet 将请求转发到另一个 Servlet(或 JSP、HTML等)进行处理,并将处理结果返回给客户端。在转发时,客户端并不知道请求被转发到了哪里,所以转发时可以使用相对路径,不一定非得使用绝对路径。 Servlet 转发示…

    Java 2023年6月15日
    00
  • Java自定义简单标签实例

    Java自定义简单标签实例可以通过JSP自定义标签实现,本攻略将介绍如何自定义一个简单的标签,并且分别提供两个示例。 1. 前置要求 在进行Java自定义简单标签实例之前,需要具备以下条件: JDK 1.6或以上版本 Tomcat服务器或其他支持Servlet和JSP的Web服务器 2. 创建一个简单的标签 首先,需要创建一个Java类,以实现自定义标签。假…

    Java 2023年6月2日
    00
  • SpringBoot JSON全局日期格式转换器实现方式

    下面是 SpringBoot JSON 全局日期格式转换器实现方式的攻略: 1. 需求分析 在 SpringBoot 应用中,Java 中的 Date 类型会默认转换为 Unix 时间戳格式,在通过 API 接口返回给前端时,需要对 Date 类型进行格式化。我们可以定义全局的 JSON 转换器来实现日期格式转换。 2. 实现方式 2.1 自定义日期格式化工…

    Java 2023年5月20日
    00
  • Java concurrency之LockSupport_动力节点Java学院整理

    Java concurrency之LockSupport 什么是LockSupport LockSupport是Java并发包中的一个类,用于创建锁和其他同步类的基本构建块,它与已有的同步类不同,其可以阻塞和唤醒线程。LockSupport提供了非常灵活的线程阻塞和唤醒操作,其不会遇到像Object.wait和Thread.join方法那样的一些限制,如同程…

    Java 2023年5月19日
    00
  • Java中常用修饰符的使用方法汇总

    Java中常用修饰符的使用方法汇总 在Java中,修饰符是一种关键字,用于修饰类、变量、方法等结构的访问权限、范围等特征。本文将会详细讲解Java中常用修饰符的使用方法,帮助读者更好地理解和掌握Java编程。 访问修饰符 Java中访问修饰符包括public、protected、default和private四种,它们分别控制着变量、方法和类的访问权限。下面…

    Java 2023年5月26日
    00
  • 源码分析SpringMvc日志打印被忽略输出问题

    源码分析SpringMvc日志打印被忽略输出问题 在 Spring MVC 中,我们可以使用日志打印来记录应用程序的运行情况。但是,有时候我们会发现日志打印被忽略输出,本文将详细讲解这个问题的原因和解决方法,并提供两个示例说明。 1. 原因分析 在 Spring MVC 中,日志打印是通过 Log4j、Logback 或者其他日志框架来实现的。如果日志打印被…

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