解决servlet请求中文乱码的通用过滤器程序

Posted 大别山人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决servlet请求中文乱码的通用过滤器程序相关的知识,希望对你有一定的参考价值。

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Set;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
* 解决乱码通用的过滤器程序
*/
public class EncodingFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 解决post
        request.setCharacterEncoding("utf-8");
        // 解决get
        EncodingRequest encodingRequest = new EncodingRequest(
                (HttpServletRequest) request);
        //解决响应乱码
        response.setCharacterEncoding("utf-8");//设置响应数据的编码格式
        response.setContentType("text/html; charset=UTF-8");//设置响应的页面编码格式
        chain.doFilter(encodingRequest, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}
class EncodingRequest extends HttpServletRequestWrapper {

    private HttpServletRequest request;

    private boolean hasEncode = false;

    public EncodingRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    @Override
    public String getParameter(String name) {
        // 通过getParameterMap方法完成
        String[] values = getParameterValues(name);
        if (values == null) {
            return null;
        }
        return values[0];
    }
    @Override
    public String[] getParameterValues(String name) {
        // 通过getParameterMap方法完成
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        return values;
    }
    @Override
    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> parameterMap = request.getParameterMap();
        String method = request.getMethod();
        if ("post".equalsIgnoreCase(method)) {
            return parameterMap;
        }
        // get提交方式 手动转码 , 这里的转码只进行一次 所以通过 hasEncode 布尔类型变量控制
        if (!hasEncode) { 
            Set<String> keys = parameterMap.keySet();
            for (String key : keys) {
                String[] values = parameterMap.get(key);
                if (values == null) {
                    continue;
                }
                for (int i = 0; i < values.length; i++) {
                    String value = values[i];
                    // 解决get
                    try {
                        value = new String(value.getBytes("ISO-8859-1"),
                                "utf-8");
                        // values是一个地址
                        values[i] = value;
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }
                //一次转码完成后,设置转码状态为true
                hasEncode = true;
            }
        }
        return parameterMap;
    }
}

 

以上是关于解决servlet请求中文乱码的通用过滤器程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用过滤器处理中文乱码

最有效的解决中文乱码的方法(配置过滤器)

解决Servlet中GET请求参数为中文时出现乱码

iOS 开发 post 提交数据 中文乱码 一串问号,怎么解决

Servlet中通过过滤器实现统一的手动编码(解决中文乱码)

16. JSP 过滤器解决Post编码乱码问题