Kotlin下Spring MVC RouterFunction的WebMvc测试返回403问题排查
问题根因
你遇到的403错误和RouterFunction匹配、MockMvc的兼容性无关,是Spring Security默认开启的CSRF校验拦截了POST请求:请求在进入路由匹配逻辑之前就被安全过滤器链直接拦截返回403,因此才会出现Handler = null的结果,你的路由配置、Controller注入逻辑都是正常的。
快速修复方案
二选一即可:
- 测试时关闭CSRF校验:给测试类添加
@AutoConfigureMockMvc(addFilters = false)注解,直接禁用所有过滤器链跳过安全校验;如果需要保留其他安全逻辑,单独配置CSRF开关即可。 - 请求携带合法CSRF令牌:构造请求时主动添加CSRF参数,修改后的请求代码如下:
mockMvc.perform(MockMvcRequestBuilders .post("/download/asset_request") .accept(MediaType(MediaType.TEXT_PLAIN)) // 新增以下行添加测试用CSRF令牌 .with(SecurityMockMvcRequestPostProcessors.csrf()) )
排查思路整理
- 先通过响应头定位拦截层级:你返回的响应头包含Spring Security默认注入的安全头(
X-Content-Type-Options、X-XSS-Protection等),可以直接确认是安全过滤器链提前拦截了请求,不需要先排查路由配置问题。 - 验证路由配置正确性:可以临时把路由改成GET请求测试,如果GET请求可以正常返回200,即可100%确认是POST请求的CSRF校验拦截问题,因为GET请求默认不会触发CSRF校验。
- 确认依赖注入正确性:可以在测试用例中打印
ctx.getBean(DownloadRoutes::class.java).dnldCtrllr的类名,确认是Mockk生成的代理类即可,@MockkBean注解会正确替换上下文里的DownloadController实例,你的注入逻辑没有问题。 - MockMvc本身完全支持RouterFunction测试,Spring官方的RouterFunction测试示例就是基于MockMvc实现的,不存在兼容性问题。
内容的提问来源于stack exchange,提问作者user2615860
相关产品推荐
相关产品推荐

