java - 在 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 下(不知道它是否有帮助)。
解决方案
答案在这里(感谢 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 来强制它。
我猜写我正在关注的讲座的那个人有一个更好的导航器,因为他从未提到过这个问题。不管怎样,现在我感觉好多了!非常感谢 !
推荐阅读
- amazon-web-services - 通过外部编辑器 (AWS CLI) 访问 AWS,虽然授权但授权错误
- sql - Hive - 以分钟计算字符串类型时间戳差异
- c# - 处理 IIS 托管的 Web 服务启动失败
- text - Thymeleaf 文本输出 [
- html - Jquery .text 有时不适用于烧瓶?
- flowtype - 如何在流中的父组件和子组件之间同步泛型类型?
- python - How to detect that large pandas dataframe has different data then before
- java - 如果 Razorpay 付款待处理,那么它将返回什么响应?
- mainframe - 如何计算分配给 VSAM 文件的空间
- postgresql - Postgres 本地过程或本地模块