首页 > 解决方案 > 在 Tomcat 服务器上使用 POST 方法从 jsp 到 jsp 的编码错误

问题描述

我目前正在学习 JEE,在练习中我只需要使用带有 POST 方法的基本表单将文本数据从 .jsp 文件发送到另一个文件。在这种形式中,我希望能够使用重音字符,所以我<%@page pageEncoding="UTF-8" %>在我的 jsp 文件之上使用,它们也有<meta charset="utf-8">标签,我的 IDE (Eclipse) 被配置为以 UTF-8 编码所有内容。

问题是在行尾,当我尝试使用 EL 显示我的字符时,重音字符(以及我猜的其他字符)以 ISO-8859-1 编码。

这里真正特别的是,当使用 GET 方法发送数据时,我根本没有任何问题。当我通过 servlet 中设置的属性在请求中传递字符串时,结果相同。

事实上,我已经通过将请求发送到 servlet 并调用request.setCharacterEncoding("utf-8")doPost 方法解决了这个问题(让我们准确地说,request.getCharacterEncoding()在那之前的调用给了我null),但我想了解这里到底发生了什么。我猜它来自服务器配置错误,但是当我检查服务器配置的 web.xml 文件时,我有以下几行:

<filter>
    <filter-name>setCharacterEncodingFilter</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>
    <async-supported>true</async-supported>
</filter>

我的困惑来自这样一个事实,没有人告诉我使用request.setCharacterEncoding("utf-8"),而且对我来说我必须这样做并不正常,所以我想问题是:我绝对必须使用它吗?为什么 ?编码不应该由服务器的配置来处理吗?

我在服务器上使用 Tomcat 9,我在 Ubuntu 下(不知道它是否有帮助)。

标签: javatomcatpostencoding

解决方案


答案在这里(感谢 Selaron):http ://balusc.omnifaces.org/2009/05/unicode-how-to-get-characters-right.html

URL 解码 POST 请求参数是另一回事。网络浏览器应该发送 Content-Type 请求标头中使用的字符集。但是,大多数网络浏览器不这样做。这些网络浏览器将只使用与提供表单的页面相同的字符编码,即它与 HTTP 响应或标记的 Content-Type 标头中指定的字符集相同。

基本上问题来自导航器,它应该传递它在标头请求中使用的编码字符集,但不这样做。由于 Tomcat 没有提供任何字符集来解码请求,因此默认情况下它自行决定采用 ISO-8859-1 样式。显然,你不能配置它!所以你只需要通过指示编码字符集是 UTF-8 来强制它。

我猜写我正在关注的讲座的那个人有一个更好的导航器,因为他从未提到过这个问题。不管怎样,现在我感觉好多了!非常感谢 !


推荐阅读