非响应式代码中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-TOKENCookie,所以选择一个不需要权限的GET端点即可获取(比如项目首页、健康检查端点等)。 - 如果你的项目自定义了CSRF Token的Cookie或请求头名称,需要对应调整代码中的
XSRF-TOKEN和X-XSRF-TOKEN为你实际使用的名称。
内容的提问来源于stack exchange,提问作者liqs
相关产品推荐
相关产品推荐

