MockMvc执行GET请求不生成JSESSIONID Cookie的技术咨询
我之前也踩过这个坑,咱们一步步来排查解决:
核心原因分析
你手动添加AuthenticationFilter的方式跳过了Spring Security测试框架的自动配置逻辑,导致负责会话创建和管理的关键过滤器没有被正确加载,所以MockMvc不会自动生成JSESSIONID Cookie。另外也得检查你的安全配置里有没有禁用会话创建的策略。
推荐解决方案
1. 使用Spring Security官方测试配置器(最省心)
替换手动添加Filter的代码,改用springSecurity()配置器,它会自动帮你注册完整的Spring Security过滤器链,包括会话管理相关的逻辑:
import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers; @Before public void initMocks(){ this.mockMvc = MockMvcBuilders.webAppContextSetup(context) .apply(SecurityMockMvcConfigurers.springSecurity()) // 替代手动添加Filter的方式 .build(); }
这样配置后,当请求触发会话需求时(比如认证流程),MockMvc会自动生成JSESSIONID Cookie并在响应中返回。
2. 手动强制创建会话(如果必须自定义Filter)
如果因为业务需求必须手动添加AuthenticationFilter,可以通过defaultRequest强制MockMvc初始化会话:
@Before public void initMocks(){ this.mockMvc = MockMvcBuilders.webAppContextSetup(context) .addFilter(new AuthenticationFilter(), "/*") // 通过添加占位符会话属性,强制MockMvc创建会话 .defaultRequest(MockMvcRequestBuilders.get("/").sessionAttr("dummy-attr", "value")) .build(); }
这里的sessionAttr只是触发会话创建的占位符,你可以根据实际需求调整属性内容。
3. 检查安全配置的会话策略
打开你的WebSecurityConfig,确保没有设置成无状态会话模式,这种模式下Spring Security不会创建会话:
@Override protected void configure(HttpSecurity http) throws Exception { http .sessionManagement() // 确保会话策略不是STATELESS,默认是IF_REQUIRED(需要时创建) .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED); // 其他安全配置... }
如果设置了STATELESS,就不会生成JSESSIONID,改成IF_REQUIRED或者ALWAYS即可。
验证方法
你可以在测试方法里添加断言,检查响应中是否包含JSESSIONID Cookie:
@Test public void testAuthenticationSession() throws Exception { mockMvc.perform(get("/your-test-endpoint")) .andExpect(status().isOk()) .andExpect(cookie().exists("JSESSIONID")); }
内容的提问来源于stack exchange,提问作者lukassko
相关产品推荐
相关产品推荐

