2014-11-15 11 views
5

Ci possono essere molti modi per risolvere problemi di codifica:Qual è la differenza tra "URIEncoding" di Tomcat, filtro di codifica e request.setCharacterEncoding

Oggi, ho un problema che percorso param non viene decodificato bene come

@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+"------------"); 
} 

posso vedere che la chiave viene decodificato male ! Se passassi una parola "新浪" dal front-end, diventerebbe "æ°æµª". Scrivo il codice qui sotto per esaminare se il server sta decodificando questo con "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); 
} 

Ed esce con la stessa uscita "æ°æµª". così infatti, la variabile path viene decodificata con ISO-8859-1.

E poi cerco di aggiungere un filtro al mio web.xml per risolvere questo problema:

<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> 

Ma lo stesso incomprensibili.

Fino a quando ho impostato al di sotto al mio server.xml

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

e funziona per questo anche io rimuovere il filtro.

Ma sono ancora molto confuso sul problema di codifica. E inoltre, questo è solo il metodo GET, se è il metodo POST, suppongo che la soluzione sarà probabilmente diversa

Qualcuno può spiegare per favore quale differenza di codifica dovremmo prendere per quale tipo di problema?

Grazie!

risposta

3
  • CharacterEncodingFilter configura la codifica del corpo della richiesta. Cioè, essa riguarda la codifica dei parametri POST richiesta, ecc, ma non influenza la codifica dei parametri GET

  • URIEncoding viene utilizzato per specificare la codifica dell'URI, quindi colpisce GET parametri

  • useBodyEncodingForURI="true" dice Tomcat utilizzare la codifica configurata per il corpo della richiesta durante la decodifica degli URI. Quindi, per quanto ho capito, se si imposta CharacterEncodingFilter e useBodyEncodingForURI="true" allora non è necessario URIEncoding.

In pratica, è necessario due cose per risolvere i possibili problemi con la codifica dei parametri:

  • CharacterEncodingFilter per POST richieste

  • URIEncoding (o useBodyEncodingForURI="true") per GET richieste

+0

1.what about 'request.setCharacterEncoding' 2. Ho letto un libro che nel metodo' GET', il pathvar e la stringa di query (URL) sono decodificati separatamente. Pertanto, abbiamo bisogno, e URIEncoding è per URI (percorso var), e 'useBodyEncodingForURI' è per stringa di query su URL .. Questo libro è sbagliato? – Jaskey

Problemi correlati