get、post请求参数乱码解决方法

原文见:https://www.cnblogs.com/ajjava/p/8079933.html

在实际的项目中我们会遇见中文乱码的问题,这个问题是很恶心的事,所以我在这里提供了一些解决中文乱码的方法,希望能给大家一些帮助。

一、单独参数乱码

?
1
post请求:request.setCharacterEncoding( "utf-8" );

当客户端通过GET请求发送数据给服务器时,使用request.getParameter()获取的数据是被服务器误认为ISO-8859-1编码的,也就是说客户端发送过来的数据无论是UTF-8还是GBK,服务器都认为是ISO-8859-1,这就说明我们需要在使用request.getParameter()获取数据后,再转发成正确的编码。例如客户端以UTF-8发送的数据,使用如下转码方式:

?
1
2
get请求:String name = "获取参数内容" ;
       name = new String(name.getBytes( "iso-8859-1" ), "utf-8" );

二、整个项目乱码

那么对于整个项目怎么统一解决乱码问题呢?这里我们利用拦截器和装饰的方法解决这个问题

我们利用装饰者模式将HttpServletRequest中的getParameter方法进行重新封装,加入处理乱码问题的方法。

复制代码
/**
 * 装饰reqeust
 * @author cxf
 *
 */
public class EncodingRequest extends HttpServletRequestWrapper {
    private HttpServletRequest req;

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

    public String getParameter(String name) {
        String value = req.getParameter(name);

        // 处理编码问题
        try {
            value = new String(value.getBytes("iso-8859-1"), "utf-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }

        return value;
    }
复制代码
复制代码
public class EncodingFilter implements Filter {
    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 处理post请求编码问题
        request.setCharacterEncoding("utf-8");

        HttpServletRequest req = (HttpServletRequest) request;

        /*
         * 处理GET请求的编码问题
         */
//        String username = request.getParameter("username");
//        username = new String(username.getBytes("ISO-8859-1"), "UTF-8");

        /*
         * 调包request
         * 1. 写一个request的装饰类
         * 2. 在放行时,使用我们自己的request
         */
        if(req.getMethod().equals("GET")) {
            EncodingRequest er = new EncodingRequest(req);
            chain.doFilter(er, response);
        } else if(req.getMethod().equals("POST")) {
            chain.doFilter(request, response);
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {

    }
复制代码

web.xml配置

复制代码
  <filter>
    <display-name>EncodingFilter</display-name>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>cn.itcast.web.filter.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
复制代码

这样post和get乱码的问题也就解决了。

三、简单方法

如果觉得上面的方式太繁琐,也可以通过修改 tomcat 的 server.xml 配置文件:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

改成

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>

注: 如果是ajax发起的get请求中文依然会乱码,这时候需要把 useBodyEncodingForURI=”true” 改为 URIEncoding=”UTF-8” 。

推荐参考文章 :https://www.cnblogs.com/binye-typing/p/6281627.html

猜你喜欢

转载自blog.csdn.net/feng_zhiyu/article/details/81771906