La configuración de Tomcat 5.5 a UTF-8 codificar todos los sendRedirect() redirecciones?

Un requisito de que el producto que estamos construyendo es que su URL extremos son semánticamente significativa para los usuarios en su idioma nativo. Esto significa que tenemos codificado en UTF-8 direcciones Url para apoyar a todos los alfabetos bajo el sol.

También nos gustaría tener para proporcionar la configuración de la instalación de la documentación para cada servidor de la aplicación y la versión que nos apoyo, por lo que sería bueno si pudiéramos lograr este código. Esto no podría ser posible, ya que por el tiempo que el Servlet se ha recibido la solicitud, ha sido codificada por el servidor de aplicaciones, etc.

Me he metido en este trabajo (para mi primer caso de uso el uso de ISO-Latin no NOS caracteres ASCII) por la reconstitución de la solicitud de la ruta info con:

String pathInfoEncoded = new String(httpServletRequest.getPathInfo().getBytes(), "UTF-8");

y, a continuación, analizar eso.

Sin embargo, esto no funciona después de la reorientación de un POST a un GET utilizando sendRedirect(). La solicitud viene en camino ya de escape (tan … es codificado como %F6) y mi método anterior no funciona.

Así que supongo que mi pregunta es voy sobre esta todo mal? Y si es así, ¿cuál es el antídoto a mi ignorancia? 🙂

Actualización : encontré la solución. El problema es que el Servlet API tiene un extraño comportamiento con respecto a la codificación de URL antes de enviar el redireccionamiento. Usted tiene que cifrar la URL de los caracteres UTF-8) ANTES de llamar a sendRedirect(). El encodeRedirectURL() método no lo haga por usted.

Esta página se discute es: http://www.whirlycott.com/phil/2005/05/11/building-j2ee-web-applications-with-utf-8-support/

InformationsquelleAutor ubermensch | 2009-05-11

3 Kommentare

  1. 4

    Un par de cosas para investigar y experimentar con:

    • Echar un vistazo a su ./conf/server.xml archivo y asegúrese de que el conector tiene la URIEncoding conjunto de atributos a «UTF-8».

    E. g.:

    <Connector port="8080" 
               protocol="HTTP/1.1" 
               URIEncoding="UTF-8"/>
    • Utilizar algún tipo de navegador basado en la herramienta (E. g.: TamperData para FireFox) para ver lo que su navegador envía al servidor–muy bien pueden escapar de él para usted. Si este es el caso, usted puede utilizar Dirección URL.decode() en el servidor.
    • En lugar de utilizar la Respuesta.redirect(), establecer manualmente las cabeceras y el código de respuesta.

    E. g.:

    response.setHeader("Location", myUtf8unencodedUrl);
    response.setStatus(response.SC_MOVED_TEMPORARILY);

    No hay promesas, pero esto es lo que yo iba a probar si se tratara de mí. 🙂

  2. 1

    Tenemos la misma situación aquí, es decir, nuestro producto también es necesaria para mostrar significativa Url para el usuario, potencialmente, en todos los idiomas de la tierra. Todas nuestras herramientas y técnicas de apoyo a UTF-8, así que no hay problema con eso. Escapando de los caracteres UTF-8 técnicamente funciona, pero IE (7, 8) muestra el aspecto feo escapó de la Url, mientras que Firefox unescapes ellos y muestra agradable url, es decir, ‘/français/Banane.html » será exhibido en IE como ‘/fran%C3%A7ais/Banane.html’.
    OBTENER después de la POST /redireccionar después de formulario envía no funciona en absoluto, ni el envío de UTF-8 urls ni escape UTF-8 direcciones url. También hemos probado el uso de XML-estilo entidad numérica de codificación sin éxito.

    Sin embargo, finalmente hemos encontrado una manera de redirigir después de un POST: la codificación de la cadena UTF-8 bytewise el uso de ISO-8859-1. Ninguno de nosotros realmente entiende cómo esto puede funcionar de todos modos (¿cómo puede el navegador saber cómo descifrar que, como el número de bytes por carácter utf-8 puede variar y ¿cómo funciona el navegador, que originalmente fue utf-8?) , pero no es así.

    He aquí un servlet para intentar que fuera:

    
    package springapp.web.servlet;
    
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.io.IOUtils;
    
    public class TestServlet extends HttpServlet {
    
     private static final long serialVersionUID = -1743198460341004958L;
    
     /* (non-Javadoc)
      * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
      */
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
       throws ServletException, IOException {
    
      String url = "çöffte.html"; 
      try {
             ServletContext context = req.getSession().getServletContext();
       //read utf8 encoded russian url
                if (context.getResource("/WEB-INF/ru_url.txt") != null){
                 InputStream is = context.getResourceAsStream("/WEB-INF/ru_url.txt"); 
                 if (is != null){
                  url = IOUtils.toString(is, "UTF-8");
                  System.out.println(String.format("Redirecting to [%s]", url));
                 }
                }
            }
            catch (FileNotFoundException fNFEx) {
             fNFEx.printStackTrace();
            }
            catch (IOException ioEx) {
             ioEx.printStackTrace();
            }
    
            byte[] utfBytes = url.getBytes("UTF-8");
            String result = new String(utfBytes, "ISO-8859-1");
            resp.sendRedirect(result);
    
            //does not work:
            //resp.sendRedirect(url);
            //resp.sendRedirect(Utf8UrlEscaper.escapeUtf8(url));
            //resp.sendRedirect(Utf8UrlEscaper.escapeToNumericEntity(url));
     }
    }

    Para el destino de redireccionamiento de copiar y pegar cualquier idioma nativo url por ejemplo de la wikipedia en un codificados en utf-8 (sin BOM!) archivo y guardar en el directorio WEB-INF. En nuestro ejemplo tomamos un ruso url (http://ru.wikipedia.org/wiki/Заглавная_страница)
    y la guarda en un archivo llamado ‘ru_url.txt’.

    Hemos creado un simple SpringMVC asignación para la aplicación de cualquier *.abc url a la prueba de servlet.
    Ahora si inicia la aplicación y escriba algo como ‘localhost:8080/springmvctest/a.abc’ debe ser redirigido a la rusa de wikipedia sitio y el navegador (IE y Firefox, Safari o más posiblemente no) debe mostrar un buen codificado en utf-8, los nativos rusos url.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea