Java 如何将所有入站请求转换为UTF-8!框架
由于向后兼容性,默认情况下,所有未定义字符集的HTTP请求都转换为ISO-8859-1。我们的内蒂发球!应用程序正确地接收带有JSON主体的PUT请求,前提是这些请求已定义了字符集。如果没有,这些请求应该以某种方式转换为UTF-8,最好是在全局应用程序级别 因此,我创建了一个Global.scala类,负责接收所有入站数据 请求,并将这些“未定义”转换为UTF-8,这将确保在进入相应模块之前,所有请求都得到正确处理Java 如何将所有入站请求转换为UTF-8!框架,java,scala,playframework,netty,Java,Scala,Playframework,Netty,由于向后兼容性,默认情况下,所有未定义字符集的HTTP请求都转换为ISO-8859-1。我们的内蒂发球!应用程序正确地接收带有JSON主体的PUT请求,前提是这些请求已定义了字符集。如果没有,这些请求应该以某种方式转换为UTF-8,最好是在全局应用程序级别 因此,我创建了一个Global.scala类,负责接收所有入站数据 请求,并将这些“未定义”转换为UTF-8,这将确保在进入相应模块之前,所有请求都得到正确处理 import play.*; public class Glo
import play.*;
public class Global extends GlobalSettings {
@Override
public Action onRequest(Request request, Method actionMethod) {
return super.onRequest(request, actionMethod);
}
}
在这个“filter”方法中,现在有一个缺失的代码段,它将查询请求是否是PUT或POST,并且没有定义字符编码,并将此请求的正文从ISO-8859-1转换为UTF-8,否则它将从其所在的任何字符集将请求的正文转换为UTF-8
Apache Tomcat通过以下过滤器解决了此问题:
我在Netty中没有发现任何类似于Tomcat的功能,只有这个全局拦截器在使用!水平 Request对象有一个返回请求正文的
body()
方法
类型为RequestBody
的主体具有一个asRaw()
方法,该方法返回一个
您可以从中获取正文的字节[],并根据需要对其进行处理。例如,String
允许您从指示字符集的字节[]创建一个字符串(请参阅),并且由于您可以从请求中的头获取Charset
,因此您可以创建正确的字符串
编辑:
在回答评论时,若要应用这一点,您可能希望使用a而不是
全局
类,那么问题是什么?如何将请求中的内容转换为UTF-8,然后再将其传递到其预期位置…我认为这不受直接支持,您需要修改播放本身,例如,可以向Http.RequestBody添加一个getter。但是我不明白如何神奇地将“undefined”转换为UTF-8,在某种程度上,您需要知道您的输入是什么,或者通过信任标头,或者隐式地(您知道您的遗留代码总是以特定的编码或类似的方式发送)。好的,如何将这些重新解析的数据返回到请求中,以便此请求要结束的端点将获得具有适当转换数据的请求。请求是不可变的,因此我在以透明方式执行时遇到了问题