服务器端URL中的字符串参数错误解码

时间:2017-06-04 17:09:19

标签: java android spring resttemplate

当我尝试将URL发送到服务器时,它看起来像: http://192.168.0.80:8080/directory/getCertainServices/1/Кузовныеработы

但在服务器端“Кузовныеработы”参数如下所示:

ÐÑзовнÑе ÑабоÑÑ

我正在使用Spring框架中的RestTemplate从客户端发送数据:

@Override
        protected Service[] doInBackground(Object... voids) {
            restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
            return restTemplate.getForObject(customURL, Service[].class);
        }

服务器端代码:

 @RequestMapping(value = "/getCertainServices/{autoServiceId}/{serviceCategory}", method = RequestMethod.GET)
    @ResponseBody
    public List<Object> getService(@PathVariable("autoServiceId") Long autoServiceId, @PathVariable("serviceCategory") String serviceCategory){
        return dataBaseServiceService.findByAutoServiceAndCategory(autoServiceId, serviceCategory);
    }

任何人都可以在这里提出建议吗?

更新问题: 这是否意味着我必须在URL路径中仅使用英语单词?

1 个答案:

答案 0 :(得分:1)

Tomcat Wiki有一个很好的页面,名为&#34; Character Encoding Issues&#34;这很好地描述了这个问题。

解决方案取决于所使用的实际Web服务器,但如果它是Tomcat(Spring的默认设置),则该解决方案位于该Wiki页面上:

  

如何更改GET参数的解释方式?

     

Tomcat将使用ISO-8859-1作为整个URL的默认字符编码,包括查询字符串(&#34; GET参数&#34;)(尽管请参阅下面的Tomcat 8通知)。

     

有两种方法可以指定如何解释GET参数:

     
      
  • 将server.xml中元素的URIEncoding属性设置为特定内容(例如URIEncoding="UTF-8")。

  •   
  • 将server.xml中元素的useBodyEncodingForURI属性设置为true。这将导致连接器使用请求主体的GET参数编码。

  •   
     

在从8.0.0开始的Tomcat 8中(8.0.0-RC3,具体而言),元素的URIEncoding属性的默认值取决于&#34;严格的servlet遵从性&#34;设置。 URIEncoding的默认值(严格合规关闭)现在为UTF-8。如果&#34;严格的servlet遵从&#34;已启用,默认值为ISO-8859-1