我正在尝试将一个url传递给@PathVariable
中的Spring MVC控制器方法但是我得到一个400
http响应代码,并且该请求在到达控制器方法之前被拒绝。
我的要求发布为:
curl 'https://127.0.0.1:8443//myapi/page/http%3A%2F%2Fwww.example.co.uk%2Ffolder%2Fpage_n0/info' -k -w "\nResponse code: %{http_code}\n"
控制器方法和UTF-8
过滤器是:
@Bean
public FilterRegistrationBean filterRegistrationBean()
{
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
@RequestMapping(value = {"/myapi/page/{url}/info"}, method = RequestMethod.GET)
public ResponseEntity<?> test(HttpServletRequest request, HttpServletResponse response, @PathVariable("url") String webPage)
{
ResponseEntity<?> results = new ResponseEntity<Map<String, Object>>(HttpStatus.OK);
// Do something here
return results;
}
我正在使用Tomcat 8.5.5,并且日志文件中没有任何内容(日志记录已设置为DEBUG级别),localhost_access_log.2016-10-04.txt
中的以下条目除外:
127.0.0.1 - - [04/Oct/2016:09:04:24 +0100] "GET //myapi/page/http%/info HTTP/1.1" 400 -
在我的测试代码中,传入的网址正在使用URLEncoder.encode()
进行编码,因此应正确编码。
在远程调试器中,我可以看到正在输入上面的CharacterEncodingFilter
注册码,因此应该注册过滤器。
我还在URIEncoding="UTF-8"
的{{1}}文件中的每个连接器中添加了server.xml
。
我正在围着这个圈子走,并继续思考有一些明显的东西我不知道。我以前从未遇到任何使用$CATALINA_HOME/conf
的问题所以我认为我遇到了某种编码问题,可能与@PathVariable
符号有关。
如果对此有任何帮助,我将不胜感激!
更新
我认为问题是,%
和AbstractHandlerMethodMapping
内的Spring正在解码整个网址,包括UriUtils
部分。然后,它无法找到解码的URL的请求映射,这是不足为奇的,因为解码的URL包括@PathVariable
中的解码的URL。我需要找到一种方法告诉Spring不要解码网址的@PathVariable
部分。
有什么想法吗?