Get与Post 乱码解决过滤器

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

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;

/**
 * 通用解决 get 和 post乱码过滤器
 *
 *
 *
 */
public class EncodingFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 处理请求乱码
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletRequest myRequest = new MyRequest(httpServletRequest);

        // 处理响应乱码
        response.setContentType("text/html;charset=utf-8");

        chain.doFilter(myRequest, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

}

// 自定义request对象
class MyRequest extends HttpServletRequestWrapper {

    private HttpServletRequest request;

    private boolean hasEncode;

    public MyRequest(HttpServletRequest request) {
        super(request);// super必须写
        this.request = request;
    }

    // 对需要增强方法 进行覆盖
    @Override
    public Map getParameterMap() {
        // 先获得请求方式
        String method = request.getMethod();
        if (method.equalsIgnoreCase("post")) {
            // post请求
            try {
                // 处理post乱码
                request.setCharacterEncoding("utf-8");
                return request.getParameterMap();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        } else if (method.equalsIgnoreCase("get")) {
            // get请求
            Map<String, String[]> parameterMap = request.getParameterMap();
            if (!hasEncode) { // 确保get手动编码逻辑只运行一次
                for (String parameterName : parameterMap.keySet()) {
                    String[] values = parameterMap.get(parameterName);
                    if (values != null) {
                        for (int i = 0; i < values.length; i++) {
                            try {
                                // 处理get乱码
                                values[i] = new String(values[i]
                                        .getBytes("ISO-8859-1"), "utf-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
                hasEncode = true;
            }
            return parameterMap;
        }

        return super.getParameterMap();
    }

    @Override
    public String getParameter(String name) {
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        if (values == null) {
            return null;
        }
        return values[0]; // 取回参数的第一个值
    }

    @Override
    public String[] getParameterValues(String name) {
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        return values;
    }

}
时间: 2024-08-01 10:42:06

Get与Post 乱码解决过滤器的相关文章

SSH项目web.xml文件的常用配置【struts2的过滤器、spring监听器、解决Hibernate延迟加载问题的过滤器、解决中文乱码的过滤器】

配置web.xml(struts2的过滤器.spring监听器.解决Hibernate延迟加载问题的过滤器.解决中文乱码的过滤器) <!-- 解决中文乱码问题 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-c

阶段3 3.SpringMVC&#183;_02.参数绑定及自定义类型转换_3 配置解决中文乱码的过滤器

输入中文 中文后台接收到 全部乱码 springMvc提供了过滤器 配置过滤器 characterEncodingFilter是首字母小写当做起的名称.当然这里也可以任意起名字.为了对应所以修改类名首字母小写 解决哪个字符集编码.CharacterEncodingFilter类里面有一个encoding的属性 中文乱码解决了 原文地址:https://www.cnblogs.com/wangjunwei/p/11376364.html

jsp中文乱码解决办法

一.JSP页面显示乱码 二.表单提交中文时出现乱码 三.数据库连接 大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到 的中文乱码的问题及解决办法写出来供大家参考. 一.JSP页面显示乱码下面的显示页面(display.jsp)就出现乱码: <html>< head>< title>JSP的中文处理</title> < meta http-equiv="Content-Type" con

url传值到Action的乱码解决方法

jsp页面 URL传中文参数到Action里面出现乱码,用过滤器和控制器都解决不了,用了我两个多小时解决这个小问题!解决方法有以下几种:第一种:在Action中用 new String(str.getBytes("ISO8859_1"), "UTF8"),进行转码,因为传递的时候,中文默人的是ISO8859_1第二种:可通过配置TOMCAT来解决此问题,具体解决方法如下:在tomcat的server.xml里,找到<Connector port="8

get请求和post的请求的乱码解决

关于get和post请求出现中文乱码解决乱码原因:首先要说的是tomcat对get和post这两种请求方式处理是不一样的,在默认情况下,两者处理的编码都是iso-8859-1:对于post提交处理:对post提交的表单通过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理之前被调用,可以在这里改变参数的编码方式对于get提交处理:修改tomcat默认配置的编码方式:在?:\Tomcat 6.0\conf\server.xml下 代码中<Connector port="8080&quo

九种乱码解决办法(非原创)

九种解决乱码方法总结2007-09-13 14:01:08 分类: IT综合技术 对于Java由于默认的编码方式是 UNICODE,所以用中文也易出问题,常见的解决是String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);前三种方法是我比较常用的方法,别人的经验告诉我:通常get方法通过改server.xml解决,post方法通过过滤器或者设置字符集解决,呵呵,不知道是否可行! 1.utf8解决JSP中文乱码问题 一般说来在每个页面的开始处

Linux下Tomcat向MySQL插入数据中文乱码解决办法

Linux下Tomcat向MySQL插入数据中文乱码解决办法 一.问题 在windows上面使用eclipse开发的项目在windows上面运行一切正常,部署到腾讯云时出现向MySQL数据库中插入数据是中文乱码 二.解决办法 1.尝试一直接在linux上面使用insert语句插入中文,正常2.尝试二在tomcat配置文件server.xml中加入useBodyEncodingForURI="true",不行3.尝试三在tomcat配置文件server.xml中再加入URIEncodin

cocos2d-x 3.4 中文乱码解决之道

cocos2dx 中文乱码解决之道 需要引入五个文件 1.iconv.h 2.iconvString.cpp 3.iconvString.h 4.iconv.dll 5.libiconv.lib 完整下载地址http://download.csdn.net/detail/dao_1990/8935089 iconv.h /* Copyright (C) 1999-2003 Free Software Foundation, Inc. This file is part of the GNU LI

sublime text3 中 CTags: Rebuild Tags执行之乱码解决方法

最近本人从事Golang开发,在开发工具上公司人员一般选择sublime text,所以,我也选择sublime text 3作为Golang的开发工具. 今天上班时安装好了sublime text 3 及 gosublime,gogdb和ctags,但是按照网上其他人所说的手册进行安装ctags后,在执行CTags: Rebuild Tags时出现如下乱码. 乱码解决: 出现乱码的原因其实是sublime text找不到ctags.exe.所以需要配置CTags的配置文件.配置手册:subli