当前位置: 首页 > 面试题库 >

Spring / Rest @PathVariable字符编码

裴俊智
2023-03-14
问题内容

在我使用的环境(Tomcat 6)中,当映射到@PathVariable时,路径段中的百分比序列显然是使用ISO-8859-1解码的。

我希望它是UTF-8。

我已经将Tomcat配置为使用UTF-8(使用server.xml中的URIEncoding属性)。

Spring / Rest是否自己进行解码?如果是,我在哪里可以覆盖默认编码?

附加信息; 这是我的测试代码:

@RequestMapping( value = "/enc/{foo}", method = RequestMethod.GET )
public HttpEntity<String> enc( @PathVariable( "foo" ) String foo, HttpServletRequest req )
{
  String resp;

  resp = "      path variable foo: " + foo + "\n" + 
         "      req.getPathInfo(): " + req.getPathInfo() + "\n" +
         "req.getPathTranslated(): " + req.getPathTranslated() + "\n" + 
         "    req.getRequestURI(): " + req.getRequestURI() + "\n" + 
         "   req.getContextPath(): " + req.getContextPath() + "\n";

  HttpHeaders headers = new HttpHeaders();
  headers.setContentType( new MediaType( "text", "plain", Charset.forName( "UTF-8" ) ) );
  return new HttpEntity<String>( resp, headers );
}

如果我使用以下URI路径执行HTTP GET请求:

/TEST/enc/%c2%a3%20and%20%e2%82%ac%20rates

这是UTF-8编码,然后是百分比编码的形式

/TEST/enc/£ and € rates

我得到的输出是:

      path variable foo: £ and ⬠rates
      req.getPathInfo(): /enc/£ and € rates
req.getPathTranslated(): C:\Users\jre\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\TEST\enc\£ and € rates
    req.getRequestURI(): /TEST/enc/%C2%A3%20and%20%E2%82%AC%20rates
   req.getContextPath(): /TEST

对我来说,这表明Tomcat(设置了URIEncoding属性后)做了正确的事情(请参阅getPathInfo()),但是path变量仍在ISO-8859-1中被解码。

答案是:

Spring / Rest显然使用了请求编码,这很奇怪,因为它是关于body的,而不是URI。叹。

添加:

<filter>
  <filter-name>CharacterEncodingFilter</filter-name>
  <filter-class>org.springframework.html" target="_blank">web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CharacterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

解决了问题。确实应该更简单。

实际上,情况更糟:

如果该方法确实具有请求主体,并且该请求主体未使用UTF-8编码,则需要附加的forceEncoding参数。这似乎可行,但我担心稍后会引起更多问题。

另一种方法

同时,我发现可以禁用解码

<property name="urlDecode" value="false"/>

…在这种情况下,接受者可以做正确的事;但这当然会使其他很多事情变得困难。


问题答案:

我需要将筛选器添加到web.xml

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


 类似资料:
  • 我使用的是Spring4.1.9.版本 配置下一个Rest控制器。 并创建了/get/{id}以某种方式隐藏/get/matrix/{vars}的映射 当我尝试通过下一个url调用它时http://localhost:8080/testmatrixvariables/get/matrix/;v1=1;v2=2;v3=3我从调试日志中获得 org.springframework.beans.Type

  • 我想指出pathvariable secondpart。这是不可能的,因为错误消息显示:无法确定:veranstaltung的类型。Identificationnumber,在表中:teilnehmer,用于列:[org.hibernate.mapping.Column(id)] 要使用变量secondpart,我必须更改什么?如何访问控制器方法中的变量secondpart? } }

  • 在spring MVC中使用中,你能给我一个简单的解释和示例吗?请包括如何键入url? 我正在努力获得正确的url以显示jsp页面。多谢了。

  • 我正在编写一个Rest服务(HTTP获取endpoint),在下面的uri中执行以下操作 获取uri中传递的客户id的详细信息 代码: 但是,在上面的代码中,对于第二个场景,控件将流向getCustomers()。 注意:我使用的是Java8和SpringWeb4.3.10版本 非常感谢任何对此的帮助。

  • 我试图获取一个用户的所有数据,该用户有一个时间戳: 现在,为了测试这个Spring Boot rest api,我在postman中调用了GET和urlhttp://localhost:8080/datum/2/2019-12-15T19:37:15.330995。 但它给我的错误是:未能转换“java”类型的值。lang.String“to required type”java。时间LocalD

  • 问题内容: 我正在使用Java Spring Resttemplate通过get请求获取json。我正在获取的JSON代替了诸如üöä或ß之类的特殊字符。所以我猜字符编码有问题。我在互联网上找不到任何帮助。我现在使用的代码是: 问题答案: 您只需将添加到模板的消息转换器中: