一尘不染

使用Spring RequestMapping路径参数的编码斜杠(%2F)提供HTTP 400

spring

不是重复的引用问题,因为它是Spring特有的。谁补充了这一点(事实发生三年后!)都不想去看问题或评论主题来看看真正的答案是什么。接受的答案并不完全是答案,但是答案的作者从未回过头来按照我的要求进行编辑。

给定下面的宁静方法,Spring 3.1给出了400错误,“客户端发送的请求在语法上不正确()。” 当token参数包含URL编码的斜杠(%2F)时,如果没有%2F精细。第三方已经在呼叫此服务(当然!),因此至少在短期内,我无法更改其发送的内容。关于如何在服务器端解决此问题的任何想法?

尽管该问题与我没有使用的UriTemplate有关,可以告诉我。

@RequestMapping("/ws/stuff/**")
@Controller
public class StuffController {
  @RequestMapping(value = "/ws/stuff/lookup/resourceId/{resourceId}/token/{token}/userName/{userName}", method = RequestMethod.GET)
   public @ResponseBody
   String provisionResource(@PathVariable("resourceId") String resourceId, @PathVariable("token") String token, @PathVariable("userName") String userName, ModelMap modelMap,
         HttpServletRequest request, HttpServletResponse response) {
      return handle(resourceId, userName, request, token, modelMap);
   }
}

注意:这是在Glassfish 3.1.2上使用的,起初是Grizzly / Glassfish不接受斜杠,但是

-Dcom.sun.grizzly.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

解决这个问题。

asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.http.encoded-slash-enabled=true

似乎没有帮助。


阅读 801

收藏
2020-04-19

共2个答案

一尘不染

我建议不要将其放在路径中,而是将其移至请求参数。

解决:

你可以将RequestMapping更改为

@RequestMapping(value = "/ws/stuff/lookup/resourceId/**", method = RequestMethod.GET) 

然后从请求对象中手动解析路径变量。

2020-04-19
一尘不染

对于spring-boot,以下技巧

@SpringBootApplication
public class Application extends WebMvcConfigurerAdapter {

    public static void main(String[] args) throws Exception {
        System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setUrlDecode(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }

}
2020-04-19