wake-up-neo.com

request.getParameter () zeigt die Zeichencodierung im Java-Servlet nicht richtig an

Ich habe ein Problem mit UTF-8 in der Java-Servlet-Datei. Wenn ich den Parameterwert in der URL erhalte, habe ich ein Problem mit UTF-8-Zeichen. Japanische Zeichen werden nicht richtig angezeigt.

Jsp-Header hat bereits

<%@ page language="Java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Ich habe die URIEncoding-Einstellung im Connector zu UTF-8 in server.xml hinzugefügt.

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

Ich habe den Code wie folgt in jsp geschrieben.

<s:textfield key="txt_name" name="txt_name" id="txt_name"
maxlength="64"></s:textfield>

<a href="javascript:showModalWindow('PopUpFile!init.action?<%=Common.PASSWORD%>=<%=Common.encript(ID, Code)%>','',940,650);">
<s:property value="PopUp Link" />
</a>

<script>
    function showModalWindow(x_URL, x_ARG, x_WIDTH, x_HEIGHT) {
        var x_OPT = "dialogHeight: " + x_HEIGHT + "px; " + "dialogWidth: "
                + x_WIDTH + "px; "
                + "Edge: Raised; center: Yes; resizable: Yes; status: Yes;";
        x_URL += "&name="+document.getElementById("txt_name").value;
        var retValue = window.showModalDialog(x_URL, x_ARG, x_OPT);
        if (retValue != null) {
            document.forms.frm.action = "ParentFile!getUser.action";
            document.forms.frm.submit();
        }
    }
</script>

Und dann habe ich den Code wie folgt in Java-Servlet geschrieben.

if(g_request.getParameter("name") != null){
    g_session.setAttribute(NAME, g_request.getParameter("name"));
}

Ich habe es auch mit der request.setCharacterEncoding()-Methode im Java-Servlet getestet, aber es funktioniert nicht wirklich. Obwohl ich viele Möglichkeiten ausprobiert habe, um das Problem der anderen mit der Zeichencodierung im Servlet im Stackoverflow zu lösen, kann ich mein Problem erst lösen.

Was kann ich tun, um die Zeichenkodierung korrekt anzuzeigen? Danke im Voraus.

7
Sandar Min Aye

Die meisten Server, einschließlich Apache Tomcat-Server, sind standardmäßig für die Parameterkodierung mit ISO-8859-1 konfiguriert. Ich denke, Sie werden dies nur ändern, wenn Sie über eine private dedizierte Serverinstanz verfügen. Daher besteht die Technik des Programmierers darin, diese Parameter manuell zu codieren/decodieren. Da Sie Javascript verwenden, ist eine Funktion in encodeURI() oder encodeURIComponent() integriert. Siehe So kodieren Sie eine URL in JavaScript . Der Code sollte sich ändern

x_URL += "&name="+encodeURI(document.getElementById("txt_name").value);

verwenden Sie in Java die URLDecoder, um den Parameter zurück zu dekodieren.

Java.net.URLDecoder.decode(((String[])request.getParameterMap().get("name"))[0], "UTF-8"));

Hinweis: Wenn Sie den Ergebnistyp Struts2 dispatcher verwenden, müssen Sie keine Parameter in der Abfragezeichenfolge dekodieren. Diese Parameter werden über UrlHelper analysiert.

Ich kann mich jedoch nicht erinnern, wann ich diese Parameter dekodiere. Sie werden automatisch in Struts2 dekodiert.

In der Regel sollten Sie wissen, dass wenn Sie Parameter in der URL übergeben, diese URL-codiert sein sollten. Wenn Sie das Formular absenden, ist dies nicht erforderlich, da es sich um x-www-form-urlencoded handelt. Weitere Informationen finden Sie unter 17.13.4 Formularinhaltstypen .

12
Roman C

Testen Sie die Ausgabe mit System.out.println? In diesem Fall ist es möglicherweise nicht für UTF-8 konfiguriert.

Siehe dies: Es können keine Sonderzeichen (UTF-8) von JSP an Servlet gesendet werden: Fragezeichen werden angezeigt

Stellen Sie außerdem sicher, dass Sie request.setCharacterEncoding("UTF-8") ausführen, BEVOR Sie die Parameter lesen.

8
stepanian

Ich habe einen ähnlichen Fehler und löse ihn mithilfe des Servlet-Filters. Wenn Sie Spring verwenden, fügen Sie einfach diese Definition zu web.xml hinzu

<!-- CharacterEncodingFilter / UTF-8 -->
    <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>

wenn Sie Spring nicht verwenden, schreiben Sie einen Servlet-Filter wie:

protected void doFilterInternal(HttpServletRequest request,
            HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        //Set character encoding as UTF-8
        request.setCharacterEncoding("UTF-8");
        filterChain.doFilter(request, response);
    }
3
erhun

Ich möchte einen Kommentar von f.khantsis zu einer Antwort eskalieren, weil er sich in meinem Fall als wichtig herausgestellt hat.

Wichtig: Stellen Sie sicher, dass dieser Filter ZUERST ausgeführt wird, bevor Sie einen anderen Filter verwenden, da er sonst nicht funktioniert.

Wir hatten eine korrekte Kodierungseinstellung in unserem Servlet-Filter:

    request.setCharacterEncoding("UTF-8");

Aber als ich einen Haltepunkt in request.getParameter eingefügt habe, hat sich gezeigt, dass wir Parameter lesen, bevor wir die Codierung festlegen. Es geschah in einem anderen Filter (csrf). In diesem Moment wurde die Codierung eingefroren und das weitere Einstellen war unwirksam. Dies mag serverabhängig sein, aber in unserem Fall (Websphere) war es der Fall.

0
Jarekczek