webentwicklung-frage-antwort-db.com.de

Übergabe von Anforderungsparametern als UTF-8-codierte Zeichenfolgen

Ich erstelle eine einfache Anmeldeseite und möchte die Anmelde- und Kennwortparameter als UTF-8-kodierte Zeichenfolgen übergeben. Wie Sie im folgenden Code sehen können, habe ich in der ersten Zeile die Kodierung auf UTF-8 gesetzt, aber es scheint sinnlos zu sein, weil es nicht funktioniert. Wenn ich Login- und Passwort-Parameter mit Akzenten verwende, erhält die Ergebnisseite merkwürdige Zeichen.

Wie kann man die Zeichenkodierung so einstellen, dass sie in allen Browsern funktioniert?

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>My Page</title>
    </head>

    <body>
        <h1>Welcome to My Page</h1>

        <form name="login" action="login.jsp" method="POST">
            Login:<br/>
            <input type="text" name="login" value="" /><br/>
            Password:<br/>
            <input type="password" name="password" value="" /><br/>
            <br/>
            <input type="submit" value="Login" /><br/>
        </form>

    </body>
</html>
26
ceklock

Die Variable pageEncoding legt nur die Antwortzeichencodierung und das Attribut charset des HTTP-Codes Content-Type fest. Grundsätzlich wird der Server angewiesen, die von JSP erzeugten Zeichen als UTF-8 zu decodieren, bevor er an den Client gesendet wird, und der Header weist den Client an, sie mit UTF-8 zu codieren und auch zu verwenden, wenn sich Formulare auf derselben Seite befinden an den Server zurückgesandt werden. Die Variable contentType ist bereits standardmäßig auf text/html festgelegt.

<%@page pageEncoding="UTF-8"%>

Das HTML-Meta-Tag wird ignoriert, wenn die Seite über HTTP bereitgestellt wird. Sie wurde nur verwendet, wenn die Seite vom Client als HTML-Datei auf dem lokalen Festplattensystem gespeichert wurde und dann von einem file://-URI im Browser geöffnet wurde.

In Ihrem speziellen Fall wurde die HTTP-Anforderungstextcodierung anscheinend nicht auf UTF-8 festgelegt. Die Codierung des Anforderungskörpers muss durch ServletRequest#setCharacterEncoding() im Servlet oder durch einen Filter festgelegt werden, bevor der erste Aufruf von request.getXxx() in jedem Servlet oder Filter erfolgt, das an der Anfrage beteiligt ist.

request.setCharacterEncoding("UTF-8");
String login = request.getParameter("login");
String password = request.getParameter("password");
// ...

Siehe auch:

48
BalusC

Das Aufrufen von ServletRequest # setCharacterEncoding () schlägt in einigen Fällen noch fehl.

Wenn Ihr Container der Servlet-Spezifikation genau folgt (wie Tomcat), werden die Post-Parameter standardmäßig als ISO-8859-1 interpretiert. Dies kann UTF-8-Zeichen (z. B. Japanisch im letzten Fall, den ich durchgearbeitet habe) durcheinander werfen, bevor sie zum Code gelangen, insbesondere wenn Sie über einen Servlet-Filter verfügen, der die Anforderungsparameter mit getParameter() oder getParameters() überprüft. Diese beiden Methoden erzwingen die Dekodierung der Parameter, und die Dekodierung wird immer nur einmal ausgeführt. 

Hier ist ein Link, wie Sie dies in Tomcat umgehen können, wenn Sie Filter haben, die die Anforderungsparameter betrachten. Die Benutzer möchten die Dokumente auf ihren jeweiligen Container überprüfen.

http://wiki.Apache.org/Tomcat/FAQ/CharacterEncoding#Q1

Der Schlüssel davon ist:

Hinzufügen

useBodyEncodingForURI="true" URIEncoding="UTF-8"

zu dem Context-Element in der server.xml von Tomcat und fügen Sie hinzu

  <filter>
    <filter-name>Character Encoding Filter</filter-name>
    <filter-class>org.Apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Character Encoding Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

wie zuvor jeder Filter, der getParameter () oder getParameters () in web.xml aufruft. Ich habe festgestellt, dass obwohl der Link oben die beiden Attribute des Context-Elements als Alternativen erscheinen lässt, der useBodyEncodingForURI-Parameter unbedingt erforderlich ist, da Tomcat die Codierung für die Abfragestrings nicht festlegen kann. Aus Request.Java in Tomcat 7.0.42:

boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
if (enc != null) {
    parameters.setEncoding(enc);
    if (useBodyEncodingForURI) {
        parameters.setQueryStringEncoding(enc);
    }
} else {
    parameters.setEncoding
        (org.Apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
    if (useBodyEncodingForURI) {
        parameters.setQueryStringEncoding
            (org.Apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
    }
}
5
Gus

Das Problem hängt davon ab, welcher Anwendungsserver verwendet wird. Sogar die Seiten sind korrekt eingestellt, z. Bei UTF8 liefert der Versuch, Parameter in korrekter Form (entsprechend der erwarteten Sprache) zu erhalten, keine guten Ergebnisse, d. h. request.getParameter (...) gibt nicht erwartete Zeichen zurück, da die Standardcodeseite für Parameter meistens 8859-1 ist. Dies bedeutet, dass die Codepage für Parameter unabhängig von der Codepage der JSP-Seite ist und die Standard-Codepage für Parameter das Ergebnis beeinflusst. Die beste Beschreibung, die ich gefunden habe, ist hier: [1]: http://docs.cksource.com/CKFinder_2.x/Developers_Guide/Java/Configuration/URI_Encoding . In einigen Anwendungsservern Die "request.setCharacterEncoding (...)" hat keine Auswirkungen. Sie müssen die Parametercodierung im Deskriptor einstellen. Am kompliziertesten sind JBoss, Apache Tomcat, in der Mitte Glassfish. Besser ist WebLogic, das Beste ist Jetty (UTF-8 ist die Standardeinstellung). In meinem Fall muss ich Glassfish-web.xml-Deskriptor erstellen und dort den Parameter-Encoding-Tag einfügen. In meinem Fall (GlassFish):

<glassfish-web-app error-url="">
  <!-- request.setCharacterEncoding("UTF-8") not functioning -->
  <parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>
2
hariprasad

Ich bin kürzlich auf dieses Problem gestoßen und konnte hier keine Antwort finden. Ich verwende Weblogic und die meisten Lösungen sind für Tomcat. 

Damit die Codierung mit Weblogic funktioniert, müssen Sie dies in Ihren weblogic.xml eingeben.

<charset-params> 
    <input-charset> 
        <resource-path>/*</resource-path> 
        <Java-charset-name>UTF-8</Java-charset-name> 
    </input-charset> 
</charset-params>

Quelle: weblogic.xml docs

HINWEIS: Ich habe auch diese Optionen in meinen _Java_OPTIONS, weiß aber nicht, ob sie notwendig sind.

-Dweblogic.webservice.i18n.charset=utf-8 
-Dfile.encoding=UTF-8
1
Phar0x

Beispiel-Zeichenkodierung: 

<%@ page language="Java" pageEncoding="utf8" contentType="text/html;charset=UTF-8" %>
0