我正在实现一个接收POST方法的服务(作为休息)。
我的系统中的编码是 UTF-8。
我使用的是 jboss 5,其中接收请求的 servlet 遵循 rfc2068 的 HTTP 1.1 规范,该规范指出:
当发送方未提供显式字符集参数时,"文本"类型的媒体子类型在通过 HTTP 接收时定义为具有默认字符集值"ISO-8859-1"。
因此,当调用我的服务的客户端使用例如 UTF-8 并且没有指定字符集,并且 POST 的正文包含 US-ASCII 之外的字符时,Jboss servlet 假定为"ISO-8859-1"并执行"错误"的解码,在我的系统中我收到"损坏"字符。例如,我收到的不是字符串"día",而是"dÂa"。
我发现的"保护"我的系统的方法是要求客户端在内容类型参数中指定字符集。如果未指定字符集,那么我用 http 403 和指示"必须指定字符集值"的文本进行响应。
这种方法有什么问题吗?
> RFC 2068 已经过时了两次,确实无关紧要。您需要查看 RFC 7231,它不再定义默认值。这意味着默认值由媒体类型的定义控制。
对于文本/纯文本,这意味着US-ASCII(据我所知),因此想要发送非ASCII字符的客户端确实需要指定字符集。