不是重复的引用问题,因为它是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
似乎没有帮助。
我建议不要将其放在路径中,而是将其移至请求参数。
解决:
你可以将RequestMapping更改为
@RequestMapping(value = "/ws/stuff/lookup/resourceId/**", method = RequestMethod.GET)
然后从请求对象中手动解析路径变量。
对于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); } }