如何在jetty12中设置HttpServletRequest和HttpServletResponse的编码?来实现它?

问题描述 投票:0回答:1

在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
1个回答
0
投票

对于 Jetty 12,

HttpServletRequest
HttpServletResponse
仅存在于支持这些对象的环境中。 (截至今天,这将是 ID 为
ee10
ee9
ee8
的环境)

这两个类上的

.setCharacterEncoding(String)
方法仅适用于 Servlet 行为。

您的代码不完整,或者您没有显示如何从 HTTP 请求标头或 HTTP 响应标头获取字符集。 (您应该尊重 HTTP 请求/响应标头中的字符集,仅在标头不清楚/模糊/不明确/空/未设置的情况下强制使用标头)

HttpServletRequest.setCharacterEncoding(字符串)

请求的字符集对

HttpServletRequest.getReader()
API 调用有影响。

请求的字符集来自以下查找。

  1. 如果
    HttpServletRequest.setCharacterEncoding(String)
    设置了字符集,请使用它。
  2. 如果 HTTP 请求标头
    Content-Type
    charset
    属性,请使用它。
  3. 如果 HTTP 请求标头
    Content-Type
    具有注册了字符集的 mime 类型,请使用该注册的字符集。
  4. 如果 HTTP 请求标头
    Locale
    存在,请使用该区域设置的默认字符集。
  5. 如果调用了
    ServletContext.setRequestCharacterEncoding(String)
    ,则使用该值。
  6. 根据 HTTP 规范默认为
    ISO8859-1

这不会影响其他 API 或行为(例如请求表单解析)

HttpServletResponse.setCharacterEncoding(字符串)

响应的字符集对

HttpServletResponse.getWriter()
API 调用有影响。

响应的字符集来自以下查找。

  1. 如果
    HttpServletResponse.setCharacterEncoding(String)
    设置了字符集,请使用它。
  2. 如果 HTTP 响应标头
    Content-Type
    charset
    属性,请使用它。
  3. 如果 HTTP 响应标头
    Content-Type
    具有注册了字符集的 mime 类型,请使用该注册的字符集。
  4. 如果设置了 HTTP 响应标头
    Locale
    ,请使用该区域设置的默认字符集。
  5. 如果调用了
    ServletContext.setResponseCharacterEncoding(String)
    ,请使用该值。
  6. 根据 HTTP 规范默认为
    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 行为的好地方。

选项

我可以为您提供两种选择。

  1. 通过

    ServletContext
    更新默认请求和响应字符集
    ServletContainerInitializer

  2. 使用 Servlet Filter 强制设置。

如果您对 Jetty 使用嵌入式模式,这些只是在启动之前将侦听器或过滤器添加到

WebAppContext
的情况。

如果您使用独立模式,您需要弄清楚如何将过滤器或侦听器放入

WebAppContext

这可以简单地通过

${jetty.base}/webapps/*.xml
可部署 XML 文件添加它。

或者您希望将它们应用于 Jetty 部署的所有 Web 应用程序

DeploymentManager
,这意味着这些需要存在于仅加载到这些环境中的 jar 中(请参阅 Jetty 模块系统和 的
[environment]
部分)
*.mod
文件将模块绑定到特定环境)。 然后,需要添加一个启动 XML(也在
*.mod
文件中定义),该 XML 会针对
DeploymentManager
阶段添加
DEPLOYING
生命周期绑定,该阶段将过滤器或侦听器添加到通过该绑定的
WebAppContext

© www.soinside.com 2019 - 2024. All rights reserved.