You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+Jetty应用认证失败时关闭HTTP连接的实现方案咨询

需求合理性判断

首先可以明确:这个需求非常合理。针对未授权的恶意客户端持续复用长连接发起请求的场景,在认证失败后立即关闭连接能显著提高攻击成本——每次无效请求后都需要重新建立TCP握手,既消耗恶意客户端的资源,也能避免服务器连接池被无效请求占用,是防护暴力破解、未授权DoS攻击的有效手段。

实现方案

由于Spring Boot+Jetty默认不会在认证失败后主动关闭连接,我们需要通过自定义Spring Security认证失败处理器结合响应头控制Jetty连接行为来实现需求,具体步骤如下:

1. 自定义认证失败处理器

创建一个继承自Spring Security默认失败处理器的类,在认证失败时添加Connection: close响应头,告诉Jetty在发送完响应后关闭当前TCP连接:

@Component
public class ConnectionClosingFailureHandler extends SimpleUrlAuthenticationFailureHandler {

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        // 添加响应头,指示Jetty关闭连接
        response.setHeader("Connection", "close");
        // 调用父类方法生成默认的认证失败响应(比如返回401状态码)
        super.onAuthenticationFailure(request, response, exception);
        // 强制刷新响应缓冲区,确保响应头和内容被立即发送
        response.flushBuffer();
    }
}

2. 在Spring Security配置中注册处理器

将自定义的失败处理器绑定到你的认证方式上(比如HTTP Basic、表单登录、JWT认证等),确保每次认证失败时都会触发连接关闭逻辑:

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private final ConnectionClosingFailureHandler failureHandler;

    // 构造注入自定义失败处理器
    public SecurityConfig(ConnectionClosingFailureHandler failureHandler) {
        this.failureHandler = failureHandler;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated() // 所有请求需要认证
            )
            // 针对HTTP Basic认证绑定失败处理器
            .httpBasic(basic -> basic
                .authenticationFailureHandler(failureHandler)
            )
            // 针对表单登录绑定失败处理器(如果使用表单登录的话)
            .formLogin(form -> form
                .failureHandler(failureHandler)
            );
        
        return http.build();
    }
}

3. 验证Jetty行为

当认证失败时,服务器会返回带有Connection: close头的401响应,Jetty收到这个头后会在发送完响应后主动关闭TCP连接。你可以通过以下方式验证:

  • 用curl发起请求,查看响应头:curl -v -u invalid:user http://your-server-url,会看到响应头包含Connection: close
  • 使用netstat或tcpdump工具,观察请求完成后TCP连接是否被主动关闭
注意事项
  • 不要全局禁用Keep-Alive:合法认证的客户端应该复用连接以提升性能,我们只针对认证失败的请求关闭连接,兼顾安全与性能
  • 适配其他认证方式:如果使用JWT、OAuth2等认证机制,需要在对应的认证失败处理逻辑中添加Connection: close响应头
  • 异常场景处理:确保在所有可能触发认证失败的路径(比如过滤器、拦截器中的认证逻辑)都添加连接关闭的逻辑

内容的提问来源于stack exchange,提问作者Onki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:33:12