我有一个DispatcherServlet,它的URL映射为/api1
,随后有一个Controller的Controller为映射的@GetMapping("/resource1")
。因此,基本上我有一个有效的URL /api1/resource1
,应由上述控制器处理。
此外,该设置还包含一个与请求/*
相匹配的Spring Security过滤器,因为它可以保护Spring未处理的其他URL(例如,泽西岛)。
由Spring Security Filter保护的API的设置类似于
protected void configure(HttpSecurity http) throws Exception {
//@formatter:off
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.requestMatchers()
.antMatchers("/api1/**")
.and()
.authorizeRequests()
.antMatchers("/**")
.authenticated()
为了进行测试,我使用MockMvc *支持来设置模拟的Web环境,包括Spring安全设置
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build()
我要测试是否应用了安全检查,并在成功的安全检查中调用了controller方法。
when:
def result = mvc.perform(
get('/api1/resource1')
.header(HttpHeaders.AUTHORIZATION, "Bearer " + apiToken))
then:
result.andExpect(status().isOk())
上面的代码基于带有MockMvc内容的Spock框架。 所有的安全检查都通过了,因此Spring安全性设置已经完成,但是最后应该调用控制器,但是失败并显示404状态,即找不到资源-这是映射的控制器方法。
我相信它会失败,因为模拟设置未包含/api
调度程序servlet映射。为了证明这一假设,我可以将控制器方法映射修改为@GetMapping("/api1/resource1")
,然后测试将得出HTTP OK(200)。
所以,我的问题是,是否可以在MockMvc设置中配置一种URL前缀? 有一个约束,代码库未使用Spring Boot(并且以后可能不会使用)!
编辑: 我在测试中添加了以下内容,以使所有请求都设置ServletPath。
static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) {
new MockHttpServletRequestBuilder(HttpMethod.GET, urlTemplate, uriVars)
.servletPath('/api1')
}
答案 0 :(得分:1)
我认为您只需要为请求配置contextPath
。
有关详细信息,请参见org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder.contextPath(String)
。