2014-11-15 5 views
5

Może istnieć wiele sposobów rozwiązania problemu Kodowanie:Jaka jest różnica między "URIEncoding" Tomcat, kodowanie Filtr i request.setCharacterEncoding

Dzisiaj mam problem, że param ścieżka nie jest dekodowany dobrze jak

@ResponseBody 
@RequestMapping(value="/context/method/{key}",method=RequestMethod.GET,produces = "application/json;charset=utf-8") 
public String method(@PathVariable String key){ 

    logger.info("key="+key+"------------"); 
} 

widzę, że kluczem jest dekodowany złe ! Jeśli przekażę słowo "新浪" z przedniego końca, stanie się ono "æ°æµª". Piszę poniższy kod w celu zbadania, czy serwer dekoduje ten z „iso-8859-1”:

public static void main(String args[]) throws UnsupportedEncodingException{ 
    String key="新浪"; 
    byte[] bytes=key.getBytes("UTF-8"); 
    String decode=new String(bytes,"ISO-8859-1"); 
    System.out.println(decode); 
} 

I to wychodzi z tego samego wyjścia "æ°æµª". tak naprawdę zmienna ścieżki jest dekodowana za pomocą ISO-8859-1.

A potem próbuję dodać filtr do mojego web.xml, aby rozwiązać ten problem:

<filter> 
    <filter-name>encodingFilter</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>encodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Ale samo nieczytelny.

Do ustawić poniżej do mojego server.xml

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" 
      URIEncoding="UTF-8" useBodyEncodingForURI="true" ----Here is Added 
/> 

I działa za to nawet ja wyjąć filtr.

Ale nadal jestem bardzo zagmatwany w kwestii kodowania. A poza tym, to jest tylko metoda GET, jeśli jest to metoda POST, domyślam się, że rozwiązanie prawdopodobnie będzie inne

Czy ktoś może wyjaśnić, jakie rozwiązanie kodowania różnic należy podjąć dla jakiego rodzaju problemu?

Dziękujemy!

Odpowiedz

3
  • CharacterEncodingFilter konfiguruje kodowanie treści żądania. Oznacza to, że wpływa na kodowanie parametrów POST żądanie, itp, ale nie wpływa na kodowanie GET parametrów

  • URIEncoding jest używany do określenia kodowania URI, dlatego wpływa GET parametry

  • useBodyEncodingForURI="true" opowiada Tomcat używać kodowania skonfigurowanego dla treści żądania podczas dekodowania identyfikatorów URI. Tak więc, o ile rozumiem, jeśli ustawisz CharacterEncodingFilter i useBodyEncodingForURI="true", to nie potrzebujesz URIEncoding.

W praktyce, trzeba dwóch rzeczy, aby rozwiązać ewentualne problemy z kodowaniem parametrów:

  • CharacterEncodingFilter dla POST wniosków

  • URIEncoding (lub useBodyEncodingForURI="true") dla GET wniosków

+0

1. co na temat 'request.setCharacterEncoding' 2. Czytam książkę, która w metodzie' GET', ścieżka pathvar i zapytanie (URL) są dekodowane osobno. Dlatego potrzebujemy, a URIEncoding jest dla URI (ścieżka var), a 'useBodyEncodingForURI' jest dla ciągu zapytania na adresie URL. Czy ta książka jest nieprawidłowa? – Jaskey

Powiązane problemy