2

我需要获取 HTTP 请求的实际字符编码。

我可以使用HttpServletRequest.getCharacterEncoding(),但是null当请求中未指定编码时,它会返回。根据常见问题解答和 HTTP 规范ISO-8859-1,我可以假设是这样。

我仍然宁愿调用一个简单地告诉我它是什么的方法,而不是根据规范假设事物。有没有这样的方法?

4

3 回答 3

1

当有人发送请求时,他/她有责任为他们的请求设置正确的编码,如果他/她没有,那么它应该被安全地视为垃圾。推测服务器端的请求编码不是明智之举,因为这会导致以后出现意想不到的问题。请求失败总比自己承担事情要好。此外,尽可能早地使请求失败,因为不必要的处理会消耗资源,如果保护不当,可能会被证明是潜在的利用。

于 2012-08-22T12:36:42.227 回答
0

如果请求标头中不存在它,则无法获取它。

但是,它与您在呈现 POST 表单的 HTML 页面的响应中使用的编码相同。通常,这样的 HTML 页面由 JSP 提供,其默认响应编码确实是 ISO-8859-1,但可以通过

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

这将设置Content-Type: text/html;charset=UTF-8响应标头,进而指示网络浏览器使用相同的字符集对任何提交的表单数据进行编码。要使用此编码正确处理 POST 请求正文,您应该显式调用

request.setCharacterEncoding("UTF-8");

事先当getCharacterEncoding()返回null

也可以看看:

于 2012-08-22T14:24:19.807 回答
0

如果http数据包中没有指定编码,那么这个函数就会有问题,一时间受到了很多批评。

显然在你的 doPost 方法中尽早调用它更有用,但我不打扰,我直接使用 Spring 的 CharacterEncodingFilter:

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/web/filter/CharacterEncodingFilter.html

它需要做更多的工作,但从长远来看,它会让生活更轻松。


没有简单的方法可以检查这一点。但是,一旦您获得请求的主体,您可以尝试从中创建一个字符串并捕获编码异常以确定编码。但我不认为这很优雅。


这是另一篇关于在处理之前检查请求的有效性的好文章:

https://www.owasp.org/index.php/How_to_add_validation_logic_to_HttpServletRequest

于 2012-08-22T11:54:05.593 回答