Cosa causa i messaggi java.io.CharConversionException con EOF o isHexDigit in Tomcat?

StackOverflow https://stackoverflow.com/questions/105551

  •  01-07-2019
  •  | 
  •  

Domanda

Questa eccezione riduce la nostra catalina di produzione su una semplice chiamata 'getParameter ()'.

WARNING: Parameters: Character decoding failed. Parameter skipped.

java.io.CharConversionException: EOF
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:82)
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48)
    at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:509)
    at org.apache.tomcat.util.http.Parameters.handleQueryParameters(Parameters.java:266)
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2361)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1005)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353)
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158)

O a volte:

java.io.CharConversionException: isHexDigit
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:87)
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48)
    at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:509)
    at org.apache.tomcat.util.http.Parameters.handleQueryParameters(Parameters.java:266)
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2361)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1005)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353)
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158)
È stato utile?

Soluzione

Ho solo ipotizzato qui. Sembra che la decodifica URL dei parametri o dei loro valori fallisca (la codifica URL significa codificare alcuni caratteri usando la notazione% XX o% XXXX dove XX o XXXX è il codice esadecimale del carattere in ISO-8859-1 o Unicode). Nel primo caso l'errore potrebbe verificarsi perché non ci sono abbastanza caratteri esadecimali dopo il carattere%. Nel secondo caso ciò potrebbe accadere perché un carattere dopo il carattere% non è esadecimale.

Altri suggerimenti

Un'altra cosa da investigare è la URIEncoding nel tuo Tomcat " Connector " ; configurazione. Se il collegamento si trova in una pagina codificata UTF-8, codificherà l'URL in byte con UTF-8, quindi l'URL codificherà uno dei byte necessari. Tuttavia, per impostazione predefinita, Tomcat ritiene che tali byte siano ISO-8859-1, il che può causare problemi.

L'inverso potrebbe anche essere vero: se la pagina è ISO-8859-1 e la URIEncoding di Tomcat è stata impostata su UTF-8, potrebbe verificarsi un errore simile.

Ecco una discussione utile sui problemi in quest'area: Problemi relativi ai set di caratteri nei contenitori JSP / Servlet

Ho iniziato a ricevere questo errore quando gli utenti stavano inviando '%' su una richiesta Ajax. Risulta che non stavo sfuggendo ai parametri prima di effettuare la richiesta. Una descrizione completa di questo scenario e correzione è trattata in questo post di blog

Potrebbe anche essere questo (da Wikipedia):

Esiste una codifica non standard per i caratteri Unicode:% uxxxx, dove xxxx è un valore Unicode rappresentato da quattro cifre esadecimali. Questo comportamento non è specificato da nessun RFC ed è stato rifiutato dal W3C. La terza edizione di ECMA-262 include ancora una funzione escape (stringa) che utilizza questa sintassi, ma anche una funzione encodeURI (uri) che converte in UTF-8 e codifica in percentuale ogni ottetto.

Quindi potresti usare la vecchia funzione di escape in Javascript, ma poiché le versioni successive di Tomcat sono più rigorose su queste cose (5.5.17 lascia che questa diapositiva di codifica), solo ora stai iniziando a vedere delle eccezioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top