##编码过滤器
功能:将客户端发送过来的数据(尤其是中文)都转换成UTF-8,这样后续的处理就不需要做其他额外的编码转换,做到编码前后统一
实现说明: 对于post请求以及响应可以直接调用setCharacterEncoding方法设置编码格式,而对于get请求,由于get请求参数是通过路径传参,而不是通过请求实体传参,所以setCharacterEncoding方法对get请求无效; 要解决get请求编码问题,需要重写request对象的getParameter方法,手动进行编码转换。
示例代码:
package filters; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.nio.charset.StandardCharsets; /** * 编码过滤器 * * 功能:将客户端发送过来的信息(尤其是中文)都转换成UTF-8,这样后续的处理就不需要做其他额外转换 * 实现说明: * 对于post请求以及响应可以直接调用setCharacterEncoding方法设置编码格式 * 而对于get请求,由于get请求参数是通过路径传参,所以setCharacterEncoding方法对get请求无效 * 需要重写request对象的getParameter方法,手动进行编码转换 */ @WebFilter(filterName = "EncodingFilter", urlPatterns = {"/*"}, initParams = {@WebInitParam(name = "encoding", value = "UTF-8")}) public class EncodingFilter implements Filter { private FilterConfig config; public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { String encoding = config.getInitParameter("encoding"); if (encoding == null) { encoding = "UTF-8"; } HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; //request GET request = new MyHttpServletRequest(request); //request POST request.setCharacterEncoding(encoding); //response response.setCharacterEncoding(encoding); chain.doFilter(request, response); } public void init(FilterConfig config) throws ServletException { this.config = config; } private class MyHttpServletRequest extends HttpServletRequestWrapper { private HttpServletRequest request; public MyHttpServletRequest(HttpServletRequest request) { super(request); this.request = request; } @Override public String getParameter(String name) { if ("get".equalsIgnoreCase(request.getMethod())) { String oriVal = request.getParameter(name); return oriVal == null ? null : new String(oriVal.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); } return super.getParameter(name); } } }