我需要在HTTP请求上获得实际的字符编码。
我可以使用HttpServletRequest.getCharacterEncoding()
,但在请求中未指定编码时会返回null
。我可以假设它是ISO-8859-1
然后,according to the FAQ和HTTP规范。
我宁愿打电话给一个简单告诉我它是什么的方法,而不是根据规范做出假设。有这样的方法吗?
答案 0 :(得分:1)
当有人发送请求时,他/她有责任为他们的请求设置正确的编码,如果他/她没有,那么它应该被安全地视为垃圾。在服务器端推测请求编码并不是明智之举,因为这会在以后导致意外问题。最好是失败一个请求而不是自己承担一些事情。此外,尽早处理请求失败,因为不必要的处理将消耗资源,如果没有得到很好的保护,可能会证明是潜在的利用。
答案 1 :(得分:0)
如果http数据包中没有指定编码,那么这个功能就会有问题,它会在一段时间内受到很多批评。
显然在你的doPost方法中早期调用它更有用,但我不打扰,我直接去Spring的CharacterEncodingFilter:
它的工作量更多,但从长远来看,它会让生活更轻松。
没有简单的方法可以检查这一点。但是一旦获得请求的主体,您可以尝试从中创建一个字符串并捕获编码异常以确定编码。但我不认为这很优雅。
这是另一篇关于在处理之前检查请求的有效性的好文章:
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
。