码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-08-27 17:06:33      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:keyset   ini   ring   通过   cep   null   wrapper   app   post   

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请求中文乱码的通用过滤器程序

标签:keyset   ini   ring   通过   cep   null   wrapper   app   post   

原文地址:http://www.cnblogs.com/pf1988/p/7440674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!