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
相关产品推荐
相关产品推荐

