安全的HTML表单接受charset?

Jér*_*nge 1 html forms spring-mvc character-encoding

我在使用get方法提交表单时面临参数编码问题(我不能使用post方法).由于我的页面是UTF8,因此URL中没有转义一些突出显示的字符.Spring控制器改为检索坏字符.

我通过设置accept-charset="ISO-8859-1"我的表单解决了这个问题,但现在,我想知道哪个charset 对所有服务器/浏览器组合都是安全的.我的表单和"获取"网址是否有任何建议?

Esa*_*ija 7

使用servlet令人沮丧(说得客气一点).标准URL编码必须使用UTF-8,但servlet不仅默认为ISO-8859-1,而且不提供任何方法来改变代码.

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

ISO-8859-1在你的表单中使用是一个黑客.使用这种古老的编码会导致比解决问题更多的问题.特别是因为浏览器不支持ISO-8859-1并且始终将其视为Windows-1252.虽然servlet将ISO-8859-1视为ISO-8859-1,但如果你顺其自然,你将无法相信.

例如,要在Tomcat中更改此设置,可以URIEncoding<connector>元素中使用该属性:

<connector ... URIEncoding="UTF-8" ... />
Run Code Online (Sandbox Code Playgroud)

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

String correct = new String(request.getParameter("test").getBytes("ISO-8859-1"), "UTF-8")
Run Code Online (Sandbox Code Playgroud)

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

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