Jetty响应字符编码

时间:2015-08-04 08:54:18

标签: java encoding character-encoding jetty content-type

如何在对UTF-8的回复中设置默认字符编码?

我试过这个

    System.setProperty("file.encoding", "UTF-8");

和这个

    System.setProperty("org.eclipse.jetty.util.UrlEncoding.charset", "utf-8");

两者都没有任何效果 - 仍然会使用标题

发送回复
Content-Type: text/html; charset=ISO-8859-1

我想对所有text / html响应执行此操作,理想情况下是代码而不是XML。我正在使用Jetty 9。

5 个答案:

答案 0 :(得分:2)

Jetty文档声称它默认使用UTF-8,但这似乎是个谎言。如果您执行正常response.getWrite().println("Hello"),则内容编码将按如下方式确定。

  1. org/eclipse/jetty/http/encoding.properties
  2. 加载从内容类型到内容编码的默认映射
            // MimeTypes.java:155
            ResourceBundle encoding = ResourceBundle.getBundle("org/eclipse/jetty/http/encoding");
            Enumeration<String> i = encoding.getKeys();
            while(i.hasMoreElements())
            {
                String type = i.nextElement();
                __encodings.put(type,encoding.getString(type));
            }
    

    默认文件是:

    text/html   = ISO-8859-1
    text/plain  = ISO-8859-1
    text/xml    = UTF-8
    text/json   = UTF-8
    
    1. Response.getWriter()尝试使用该地图,但默认为ISO-8859-1
    2. @Override
      public PrintWriter getWriter() throws IOException
      {
          if (_outputType == OutputType.STREAM)
              throw new IllegalStateException("STREAM");
      
          if (_outputType == OutputType.NONE)
          {
              /* get encoding from Content-Type header */
              String encoding = _characterEncoding;
              if (encoding == null)
              {
                  encoding = MimeTypes.inferCharsetFromContentType(_contentType);
                  if (encoding == null)
                      encoding = StringUtil.__ISO_8859_1;
                  setCharacterEncoding(encoding);
              }
      

      因此,您可以看到,对于text/html,它不会默认为UTF-8。我不认为有一种方法可以改变代码的默认值。您可以做的最好的事情是将encoding.properties文件更改为:

      text/html   = UTF-8
      text/plain  = UTF-8
      text/xml    = UTF-8
      text/json   = UTF-8
      

      但即便如此,如果发现其中没有编码,也会默认为ISO-8859-1。

答案 1 :(得分:1)

response.setCharacterEncoding("UTF-8");

答案 2 :(得分:1)

我为一个遗留应用程序创建了字符编码过滤器。

public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        if(req instanceof Request){             
            req.setCharacterEncoding("UTF-8");
        }
        chain.doFilter(req, res);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

在web.xml中,filter-mapping的url-pattern为/ *。这将通过CharacterEncodingFilter路由来自Web应用程序的所有请求。

<filter>
    <display-name>CharacterEncoding</display-name>
    <filter-name>CharacterEncoding</filter-name>
    <filter-class>my.app.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

答案 3 :(得分:0)

使用Writer();

时很重要

对我来说如果我写

resp.getWriter().println("Return");
resp.setContentType("text/html; charset=UTF-8");

我不会工作

但如果我改变了序列

resp.setContentType("text/html; charset=UTF-8");
resp.getWriter().println("Return");

没关系

答案 4 :(得分:0)

例如,您可以将默认的UTF-8字符集更改为ISO-8859-1。 文档没有明确说明9.3版以后的版本的哪个参数名称。 在9.3之前是org.eclipse.jetty.util.URI.charset 对于新版本,它已更改为org.eclipse.jetty.util.UrlEncoding.charset 这是一个示例:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.4.15.v20190215</version>
    <configuration>
        <systemPropertiesFile>src/main/config/jetty/encode.properties</systemPropertiesFile>
        <jettyXml>src/main/config/jetty/jetty-env.xml</jettyXml>
    </configuration>    
</plugin>

encode.properties的内容

org.eclipse.jetty.util.UrlEncoding.charset=ISO-8859-1