You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetty12中如何设置HttpServletRequest与HttpServletResponse编码?有无替代方案?

Jetty 12 中设置请求、响应及URI编码的替代方案

一、自定义Handler(替代Jetty9的HandlerWrapper方式)

Jetty12重构了Handler体系,原HandlerWrapper的逻辑可通过继承AbstractHandler实现,核心是重写新的handle(Request request, Response response)方法,示例代码如下:

import org.eclipse.jetty.server.AbstractHandler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.util.StringUtil;

import java.io.UnsupportedEncodingException;

public class CharacterEncodingHandler extends AbstractHandler {
    private String URICharset;
    private String requestCharacterEncoding;
    private String responseCharacterEncoding;

    @Override
    public boolean handle(Request request, Response response) throws UnsupportedEncodingException {
        // 设置URI查询参数编码
        if (StringUtil.isNotBlank(URICharset)) {
            request.setQueryEncoding(URICharset);
        }

        // 设置请求体编码(仅当未设置时)
        if (StringUtil.isNotBlank(requestCharacterEncoding) && request.getCharacterEncoding() == null) {
            request.setCharacterEncoding(requestCharacterEncoding);
        }

        // 设置响应编码
        if (StringUtil.isNotBlank(responseCharacterEncoding)) {
            response.setCharacterEncoding(responseCharacterEncoding);
        }

        // 传递请求给下一个Handler
        return false;
    }

    // 省略getter/setter方法
}

注册Handler到Server的示例:

Server server = new Server(8080);
CharacterEncodingHandler encodingHandler = new CharacterEncodingHandler();
encodingHandler.setURICharset("UTF-8");
encodingHandler.setRequestCharacterEncoding("UTF-8");
encodingHandler.setResponseCharacterEncoding("UTF-8");

// 将编码Handler作为前置处理器,后续可组合业务Handler
server.setHandler(encodingHandler);

二、全局配置HttpConfiguration(推荐,无需自定义代码)

Jetty12支持通过HttpConfiguration全局统一设置编码,无需编写自定义Handler,代码示例:

import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;

public class JettyServerConfig {
    public static void main(String[] args) throws Exception {
        Server server = new Server();

        HttpConfiguration httpConfig = new HttpConfiguration();
        // 设置URI查询参数编码
        httpConfig.setRequestURIEncoding("UTF-8");
        // 设置请求体编码
        httpConfig.setRequestCharacterEncoding("UTF-8");
        // 设置响应编码
        httpConfig.setResponseCharacterEncoding("UTF-8");

        ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfig));
        connector.setPort(8080);
        server.addConnector(connector);

        // 添加业务Handler
        // server.setHandler(...);

        server.start();
        server.join();
    }
}

三、使用标准Servlet Filter(跨容器通用)

如果是基于Servlet的应用,推荐使用标准Servlet Filter实现编码设置,这种方式与Jetty版本无关,兼容性更强:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "CharacterEncodingFilter", urlPatterns = "/*")
public class CharacterEncodingFilter implements Filter {
    private String requestCharacterEncoding;
    private String responseCharacterEncoding;
    private String URICharset;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.requestCharacterEncoding = filterConfig.getInitParameter("requestCharacterEncoding");
        this.responseCharacterEncoding = filterConfig.getInitParameter("responseCharacterEncoding");
        this.URICharset = filterConfig.getInitParameter("URICharset");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 设置URI查询参数编码(Jetty特定属性)
        if (URICharset != null && !URICharset.isEmpty()) {
            request.setAttribute("org.eclipse.jetty.server.Request.queryEncoding", URICharset);
        }

        // 设置请求体编码
        if (requestCharacterEncoding != null && !requestCharacterEncoding.isEmpty() && request.getCharacterEncoding() == null) {
            request.setCharacterEncoding(requestCharacterEncoding);
        }

        // 设置响应编码
        if (responseCharacterEncoding != null && !responseCharacterEncoding.isEmpty()) {
            response.setCharacterEncoding(responseCharacterEncoding);
        }

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 清理资源
    }
}

若不使用注解,可在web.xml中配置:

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.yourpackage.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>requestCharacterEncoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>responseCharacterEncoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>URICharset</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

内容的提问来源于stack exchange,提问作者yusen zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:15:11