html - 安全的 HTML 表单接受字符集吗?

标签 html forms spring-mvc character-encoding

我在使用 get 方法提交表单时遇到参数编码问题(我不能使用 post 方法)。由于我的页面是 UTF8,因此 URL 中的一些重音字符未转义。 Spring Controller 检索到错误字符。

我通过在我的表单上设置 accept-charset="ISO-8859-1" 解决了这个问题,但现在,我想知道哪个字符集对所有人安全服务器/浏览器组合。是否有任何推荐用于我的表单和“获取”URL?

最佳答案

这对 servlet 来说是令人沮丧的(委婉地说)。标准 URL 编码必须使用 UTF-8,但 servlet 不仅默认为 ISO-8859-1,而且不提供任何方式来用代码更改它。

当然可以req.setRequestEncoding("UTF-8")在您阅读任何内容之前,但出于某些不敬虔的原因,这只会影响请求正文,而不影响查询字符串参数。 servlet 请求接口(interface)中没有任何内容来指定用于查询字符串参数的编码。

使用 ISO-8859-1在你的表格中是一个黑客。使用这种古老的编码会导致比解决问题更多的问题。特别是因为浏览器不支持 ISO-8859-1 并且始终将其视为 Windows-1252。而 servlet 将 ISO-8859-1 视为 ISO-8859-1,因此如果您采用这种方式,您将被搞得难以置信。

例如,要在 Tomcat 中更改它,您可以使用 URIEncoding <connector> 中的属性元素:

<connector ... URIEncoding="UTF-8" ... />

如果您不使用具有这些设置的容器,无法更改其设置或其他一些问题,您仍然可以使其正常工作,因为 ISO-8859-1 解码保留了原始二进制文件的完整信息。

String correct = new String(request.getParameter("test").getBytes("ISO-8859-1"), "UTF-8")

假设 test=ä如果一切设置正确,浏览器会将其编码为 test=%C3%A4 .您的 servlet 会错误地将其解码为 ISO-8859-1 并为您提供结果字符串 "ä" .如果应用更正,您可以获得 ä返回:

System.out.println(new String("ä".getBytes("ISO-8859-1"), "UTF-8").equals("ä"));
//true

关于html - 安全的 HTML 表单接受字符集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15278512/

相关文章:

javascript - 错误 : Content Security Policy: The page’s settings blocked the loading of a resource

javascript - 在没有 "px"的情况下获取按钮 Javascript 的宽度

html - 添加 if else 条件以使用 AngularJs 关闭和打开 ng-repeat 内的 HTML 元素

javascript - 提交前验证表单

html - 位置 <表格 :radiobuttons> vertically

html - minmax() 默认为最大值

html - 如何在表单中的另一个 div 中 float div 部分?

C# 如何设置和读取文本文档中的控件设置 Win Forms

java - Spring Boot 1.4.3 和 @ControllerAdvice

java - 如何在参数对象类中使用@CookieValue?