Java HttpServletRequest-setCharacterEncoding似乎什么都不做

Java HttpServletRequest-setCharacterEncoding似乎什么都不做,java,character-encoding,servlets,Java,Character Encoding,Servlets,我正在尝试从请求中读取UTF-8信息。 我使用了“request.setCharacterEncoding(“UTF-8”);”,但它似乎没有任何作用-读取的信息不是UTF-8 我做错了什么?您是否在任何request.getParameter调用后都这样做 request.setCharacterEncoding(“UTF-8”)必须在调用任何request.getParameter()之前调用。如果您使用的是tomcat,还应在连接器中将URIEncoding设置为UTF-8: <Se

我正在尝试从请求中读取UTF-8信息。 我使用了“request.setCharacterEncoding(“UTF-8”);”,但它似乎没有任何作用-读取的信息不是UTF-8


我做错了什么?

您是否在任何request.getParameter调用后都这样做


request.setCharacterEncoding(“UTF-8”)
必须在调用任何
request.getParameter()
之前调用。

如果您使用的是tomcat,还应在连接器中将URIEncoding设置为UTF-8:

<Server port="8105" shutdown="SHUTDOWN">
...
    <Service name="Catalina">
        <Connector port="8180" URIEncoding="UTF-8" />
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost" appBase="webapps" />
        </Engine>
    </Service>
</Server>

...

只是为了确认,对于POST参数,您必须在获取参数之前调用
request.setCharacterEncoding(…)
。 对于GET参数,这取决于您使用的web容器(使用Maurice Perry对Tomcat的回答)

请查看此链接以了解更多信息。“从浏览器到数据库的字符转换”

只有当请求是
POST
请求且请求正文尚未处理时,才有效

因此,如果它在您的情况下不起作用,那么可能有两个原因:

  • 实际上,您正在触发一个
    GET
    请求。即,请求参数通过请求URL而不是请求正文从客户端发送到服务器。请求URL由Web服务器处理,而不是由Servlet API处理。因此,要解决这个问题,您需要将相关的Web服务器配置为使用指定的字符编码对请求URL(URI)进行解码。例如,对于Apache Tomcat,您需要将
    server.xml
    中元素的
    URIEncoding
    属性设置为
    UTF-8

  • 您正确地使用了
    POST
    ,但您已经(间接地)处理了请求正文,因此更改字符编码为时已晚。只有在第一次调用
    getParameterXXX()
    方法时,才会完全处理请求正文。有很多。在以后的通话中不会对其进行重新处理。在确定谁调用此方法时,不要忘记考虑
    web.xml
    中所有声明的
    Filter
    实例。其中一些可能会抓取并扫描参数

  • 如果这仍然没有任何帮助,那么剩下的唯一可能原因是显示控制台或记录器或用于打印/确定/调试获得的请求参数的任何设备不支持UTF-8。您希望将控制台/记录器/etc重新配置为使用UTF-8来显示字符。例如,如果它是Eclipse控制台,那么您可以通过窗口>首选项>常规>工作区>文本文件编码来设置它

    另见:
    • 更多背景信息、实例和解决方案

      • 这种方法真是愚蠢。它不应该在那里,你也不应该使用它

        对于POST请求中的主体,编码应该由客户端在内容类型头中显式定义。如果不是,这是一个错误的请求。[1]

        对于GET请求URI,客户端不能指定编码,服务器必须具有隐式编码,程序员需要设置编码,但Servlet API中不存在该方法

        然而,servlet容器可以有一种专有的方法来实现这一点

        最好的方法可能是将JVM的默认编码设置为UTF-8

        1:

        “字符集”参数与某些媒体类型一起使用,以定义数据的字符集(第3.4节)。当发送方未提供明确的字符集参数时,“文本”类型的媒体子类型定义为当通过HTTP接收时默认的字符集值为“ISO-8859-1”。除“ISO-8859-1”或其子集以外的字符集中的数据必须用适当的字符集值标记。

        (关于第一个问题…)
        如果从正文中读取参数,则还可以使用其自身的编码读取每个项目(查看最后一行):


        问题取决于使用哪个应用程序服务器。这是我在这本书中找到的最好的描述

        在某些应用程序服务器中,
        请求.setCharacterEncoding(…)
        在使用描述符设置应用程序编码之前无效。最复杂的是JBoss、ApacheTomcat和Glassfish。WebLogic更好,Jetty最好(默认设置为UTF-8)

        在我的例子中,我必须创建一个
        glassfishweb.xml
        描述符,并将
        参数编码
        标记放在那里。就我而言,对于玻璃鱼:


        对于jboss/wildfly,有一个功能请求

        将其放入WEB-INF/jboss-WEB.xml:

        <?xml version="1.0" encoding="UTF-8"?>
        <jboss-web version="8.0" xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.jboss.org/j2ee/schema/jboss-web_8_0.xsd">
            <!-- browser tend to not send encoding information, so we have to match the servlet container's
            default encoding with our requested form data encoding: -->
            <default-encoding>UTF-8</default-encoding>
        </jboss-web>
        
        
        UTF-8
        
        Tomcat(至少)的一个函数,它包括在任何过滤器或任何阀门中对
        getParameter()进行的任何调用。(所以不要使用RequestDumperValve!)我首先要设置字符编码。正如下面的回答,POST方法可以很好地工作,但GET方法不行。我认为他试图读取请求数据,不知道如何正确解码。此标志不改变请求数据的编码方式,它告诉服务器URI(URL)的编码方式。实际上,它告诉tomcat在解码浏览器发送的URL时使用UTF-8;如果未指定,则将使用ISO-8859-1。如果URL包含表单参数,则无法正确解码。是否有非容器特定的解决方案?我对jetty也有同样的问题。很抱歉,解决方案是特定于jetty的:告诉负责发送标题的客户端和/或HTTP规范的发明者,沿内容类型标题发送编码是必需的。更新了此处提到的非常有用的文章的链接:谢谢,这篇文章使用了glassfish 4.1。请注意,用户也需要添加request.setCharacterEncoding-参数不够。感谢您的澄清。第2点是我的原因,您搞定了!感谢声明:
        覆盖了这个名称
        
        <?xml version="1.0" encoding="UTF-8"?>
        <jboss-web version="8.0" xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.jboss.org/j2ee/schema/jboss-web_8_0.xsd">
            <!-- browser tend to not send encoding information, so we have to match the servlet container's
            default encoding with our requested form data encoding: -->
            <default-encoding>UTF-8</default-encoding>
        </jboss-web>