在Servlet / Tomcat中获取请求编码

时间:2012-08-22 11:48:03

标签: java http tomcat servlets character-encoding

我需要在HTTP请求上获得实际的字符编码。

我可以使用HttpServletRequest.getCharacterEncoding(),但在请求中未指定编码时会返回null。我可以假设它是ISO-8859-1然后,according to the FAQ和HTTP规范。

我宁愿打电话给一个简单告诉我它是什么的方法,而不是根据规范做出假设。有这样的方法吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分:0)

如果请求标头中没有它,则无法获取它。

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

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

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

request.setCharacterEncoding("UTF-8");

预先getCharacterEncoding()返回null

另见: