字符过滤器中get与post的中文乱码处理

servlet过多时,写一个过滤器专门处理,从而不用频繁地用request设置;

web.xml中对应的配置

<filter>
<display-name>CharEncordingFilter</display-name>
<filter-name>CharEncordingFilter</filter-name>
<filter-class>com.sea.filter.CharEncordingFilter</filter-class>
<init-param>
<param-name>charSet</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharEncordingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

//过滤器核心代码

public class CharEncordingFilter implements Filter {

private String charSet = "ISO8859-1";

public CharEncordingFilter() {

}


public void destroy() {

}


public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    //将req进行封装扩展
    req = new SeaRequest(req);
    //判断请求方法
    String method = req.getMethod();
    if ("post".equalsIgnoreCase(method)) {
    //修改编码
        req.setCharacterEncoding(charSet);
    }
    //无论如何都要放行
    chain.doFilter(req, response);
}


public void init(FilterConfig fConfig) throws ServletException {
//获取配置的字符集
    String encoding = fConfig.getInitParameter("charSet");
    if (encoding != null && !"".equals(encoding)) {
        charSet = encoding;
    }
}

class SeaRequest extends HttpServletRequestWrapper {
    private HttpServletRequest request;
    private String method = "get";

    public SeaRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
        method = request.getMethod();

    }

    @Override
    public String getParameter(String name) {
        if (method.equalsIgnoreCase("get")) {
        //解码
            String value = this.request.getParameter(name);
            try {
                value = new String(value.getBytes("ISO8859-1"), charSet);
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return value;
        }
        return super.getParameter(name);
    }

    @Override
    public Map<String, String[]> getParameterMap() {

        Map<String, String[]> params = new HashMap<>();
        Map<String, String[]> parameterMap = this.request.getParameterMap();

//统一解码

for (String key : parameterMap.keySet()) {
        //取一组value出来
            String[] values = parameterMap.get(key);
            for (int i = 0; i < values.length; i++) {
                try {
                    values[i] = new String(values[i].getBytes("iso8859-1"), charSet);
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            //将解码之后的值再次放入map中
            params.put(key, values);
        }
        return params;
    }

}

}

猜你喜欢

转载自blog.csdn.net/sinat_43094886/article/details/82263521