将@PathVariable中的url传递给Spring MVC控制器方法

时间:2016-10-04 08:39:26

标签: spring-mvc

我正在尝试将一个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部分。

有什么想法吗?

0 个答案:

没有答案