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

非响应式代码中WebTestClient使用csrf()方法报错求助

问题原因

SecurityMockServerConfigurers.csrf()是为响应式WebFlux框架设计的测试配置器,你的项目是基于Servlet的非响应式Spring Boot,使用这个配置器会触发空指针异常——因为Servlet环境下的WebTestClient底层并没有WebHttpHandlerBuilder实例,调用mutateWith时自然会出现Cannot invoke "org.springframework.web.server.adapter.WebHttpHandlerBuilder.filters(...)"的错误。

解决方案(非响应式环境适配)

不需要用SecurityMockServerConfigurers,直接手动获取并携带CSRF Token即可,以下是可行的测试代码:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
public class Test {
    @Autowired
    private WebTestClient webTestClient;

    @Test
    public void test1() {
        // 1. 先发送一个GET请求获取CSRF Token(Cookie中返回)
        String csrfToken = webTestClient.get()
                .uri("/") // 替换成你项目中任意能返回CSRF Cookie的GET端点
                .exchange()
                .expectCookie().exists("XSRF-TOKEN")
                .returnResult(Void.class)
                .getResponseCookies()
                .getFirst("XSRF-TOKEN")
                .getValue();

        // 2. 发送POST请求时,在请求头中携带CSRF Token
        webTestClient.post()
                .uri("/endpoint")
                .header("X-XSRF-TOKEN", csrfToken)
                .bodyValue(value) // 确保value已正确定义
                .exchange()
                .expectStatus().isOk();
    }
}

补充说明

  • Spring Security默认会给GET请求注入XSRF-TOKEN Cookie,所以选择一个不需要权限的GET端点即可获取(比如项目首页、健康检查端点等)。
  • 如果你的项目自定义了CSRF Token的Cookie或请求头名称,需要对应调整代码中的XSRF-TOKEN和X-XSRF-TOKEN为你实际使用的名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:52:04