在jetty9中,我可以通过继承handlerWrapper并重写handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse 响应)。 jetty12 有其他方法吗? 我是这样设置的 ` 受保护的无效 doFilterCharacterEncoding( HttpServletRequest 请求,HttpServletResponse 响应) 抛出 UnsupportedEncodingException {
if (StringUtil.isNotBlank(URICharset)) {
request.setAttribute("org.eclipse.jetty.server.Request.queryEncoding", URICharset);
}
if (StringUtil.isNotBlank(requestCharacterEncoding) && request.getCharacterEncoding() == null) {
request.setCharacterEncoding(requestCharacterEncoding);
}
if (StringUtil.isNotBlank(responseCharacterEncoding)) {
response.setCharacterEncoding(responseCharacterEncoding);
}
}
` 有什么替代方法吗?
对于 Jetty 12,
HttpServletRequest
和 HttpServletResponse
仅存在于支持这些对象的环境中。 (截至今天,这将是 ID 为 ee10
、ee9
和 ee8
的环境)
这两个类上的
.setCharacterEncoding(String)
方法仅适用于 Servlet 行为。
您的代码不完整,或者您没有显示如何从 HTTP 请求标头或 HTTP 响应标头获取字符集。 (您应该尊重 HTTP 请求/响应标头中的字符集,仅在标头不清楚/模糊/不明确/空/未设置的情况下强制使用标头)
请求的字符集对
HttpServletRequest.getReader()
API 调用有影响。
请求的字符集来自以下查找。
HttpServletRequest.setCharacterEncoding(String)
设置了字符集,请使用它。Content-Type
有 charset
属性,请使用它。Content-Type
具有注册了字符集的 mime 类型,请使用该注册的字符集。Locale
存在,请使用该区域设置的默认字符集。ServletContext.setRequestCharacterEncoding(String)
,则使用该值。ISO8859-1
。这不会影响其他 API 或行为(例如请求表单解析)
响应的字符集对
HttpServletResponse.getWriter()
API 调用有影响。
响应的字符集来自以下查找。
HttpServletResponse.setCharacterEncoding(String)
设置了字符集,请使用它。Content-Type
有 charset
属性,请使用它。Content-Type
具有注册了字符集的 mime 类型,请使用该注册的字符集。Locale
,请使用该区域设置的默认字符集。ServletContext.setResponseCharacterEncoding(String)
,请使用该值。ISO8859-1
。从 Jetty Core Handler 中,您无法像您尝试那样通过设置
charset
的值来影响 Servlet 层中的此行为。 这是因为在 Jetty Core 上,不存在 charset
与 Content-Type
分离的概念,它们是捆绑在一起的,就像 HTTP 规范的意图一样。
相反,您必须将其视为调整
Content-Type
标头以适应您的应用程序和您尝试调整的 mime 类型的规则的需求(例如:您无法在 上设置
charset
标头application/json
因为该 mime 类型的规范拒绝任何设置 charset
属性的尝试,但这些规则是由 Jetty 的 MimeTypes
对象处理的)
Jetty Core 不是尝试影响 Servlet 行为的好地方。
我可以为您提供两种选择。
通过
ServletContext
更新默认请求和响应字符集 ServletContainerInitializer
。
使用 Servlet Filter 强制设置。
如果您对 Jetty 使用嵌入式模式,这些只是在启动之前将侦听器或过滤器添加到
WebAppContext
的情况。
如果您使用独立模式,您需要弄清楚如何将过滤器或侦听器放入
WebAppContext
这可以简单地通过
${jetty.base}/webapps/*.xml
可部署 XML 文件添加它。
或者您希望将它们应用于 Jetty 部署的所有 Web 应用程序
DeploymentManager
,这意味着这些需要存在于仅加载到这些环境中的 jar 中(请参阅 Jetty 模块系统和 的 [environment]
部分) *.mod
文件将模块绑定到特定环境)。 然后,需要添加一个启动 XML(也在 *.mod
文件中定义),该 XML 会针对 DeploymentManager
阶段添加 DEPLOYING
生命周期绑定,该阶段将过滤器或侦听器添加到通过该绑定的 WebAppContext
。