【Servlet】彻底了解doGet和doPost中文乱码问题

我们在javaWeb项目时,使用doget和dopost总是会出现各种原因的中文乱码问题,楼主在查阅大量资料后,将为什么有这样的问题,和如何解决这种问题做个总结。

1.先抛出doPost方法request.getParameter("xxx");乱码的解决方案

在方法体开头加:

//设置request对象的解码方式
request.setCharacterEncoding("utf-8");

这样得到的字符串编码格式就是utf-8,控制台中文乱码即可解决;(此时PrintWriter输出页面时乱码仍存在)

2.doGet和doPost使用PrintWriter out = response.getWriter();输出时乱码解决方案

在PrintWriter out = response.getWriter();前加:

//设置response返回输出的编码方式
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();

相对于加这两句:

response.setHeader("Content-type", "text/html;charset=UTF-8");  
response.setCharacterEncoding("UTF-8");  
PrintWriter out = response.getWriter();

3.重头戏:doGet方法request.getParameter("xxx");乱码的解决方案

我们为什么喜欢用doPost?因为它安全,它容量无限,它是跟着requset请求体过来的数据,

也就意味着

request.setCharacterEncoding("utf-8");对它起作用!编码取值问题一句代码解决,可不快哉?

doGet方法?不安全(URL后面会附带参数),容量小(最多1、2KB),数据不跟着requset请求体,而是放在URL后面!

也就意味着

request.setCharacterEncoding("utf-8");对doGet没有任何用,我们需要另外转码,天呐,好烦~

重中之中:tomcat版本不同,对url的默认解析编码不同

tomcat8.0版本之前

tomcat8.0版本之前,默认编码是ISO-8859-1

解决方案1:手动字符串转码

所以我们可以看见许多人解决doget中文乱码是这样的:

String username=new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");

因为默认编码是ISO-8859-1,用getBytes(“ISO-8859-1“)拿到原编码的byte数组,再通过new一个String转成utf-8编码。

但缺点是每一个参数都要转码,可以改到你大脑颤抖~

解决方案2:修改默认编码为UTF-8

既然默认编码是ISO-8859-1,那么修改默认编码就好

找到 tomcat目录\\conf\server.xml

添加 URIEncoding="UTF-8"

添加之后,解析编码就是UTF-8,doGet从页面拿值就不需要转码了

但此方法并不推荐,因为各个机子的环境不同,在你机子上能跑,去别人那就跑不了了。

解决方案3:过滤器转码

网上有例子:

他写的比较全,可以对dopost和doget都进行配置

过滤器解决servlet中文乱码

tomcat8.0版本之后

tomcat8.0版本之后,默认编码是UTF-8,相当于是8.0版本之前加了URIEncoding="UTF-8"(即上方的解决方案2)

此时doget就很好用了,比dopost甚至还省了一行request.setCharacterEncoding("utf-8");

可喜可贺~

dopost还是老样子,该加的东西还得加!

4.具体实例

tomcat 7实例(没有对servlet.xml进行修改,默认编码为ISO-8859-1,doget需手动转码

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;


@WebServlet(
        urlPatterns = "/RequestParamsServlet"
)
public class RequestParamsServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置request对象的解码方式
        request.setCharacterEncoding("utf-8");
        //设置response返回输出的编码方式
        response.setContentType("text/html;charset=utf-8");
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("用户名:" + name);
        System.out.println("密 码:" + password);
        PrintWriter out = response.getWriter();
        out.println("用户名:" + name);
        out.println("密 码:" + password);
        // 获取参数名为“hobby”的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.print("爱好:");
        out.println("爱好:");
        for (int i = 0; i < hobbys.length; i++) {
            System.out.print(hobbys[i] + ",");
            out.println(hobbys[i] + ",");
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
       //设置response返回输出的编码方式
        response.setContentType("text/html;charset=utf-8");
        String name=new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");
        String password=new String(request.getParameter("password").getBytes("ISO-8859-1"), "UTF-8");
        System.out.println("用户名:" + name);
        System.out.println("密 码:" + password);
        PrintWriter out = response.getWriter();
        out.println("用户名:" + name);
        out.println("密 码:" + password);
        // 获取参数名为“hobby”的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.print("爱好:");
        out.println("爱好:");
        for (int i = 0; i < hobbys.length; i++) {
            hobbys[i]=new String(hobbys[i].getBytes("ISO-8859-1"),"UTF-8");
            System.out.print(hobbys[i] + ",");
            out.println(hobbys[i] + ",");
        }

    }
}

tomcat 9实例(没有对servlet.xml进行修改,默认编码为UTF-8,doget无需转码

package org.hc.maven.testnew;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;


@WebServlet(
        urlPatterns = "/RequestParamsServlet"
)
public class RequestParamsServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置request对象的解码方式
        request.setCharacterEncoding("utf-8");
        //设置response返回输出的编码方式
        response.setContentType("text/html;charset=utf-8");
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("用户名:" + name);
        System.out.println("密 码:" + password);
        PrintWriter out = response.getWriter();
        out.println("用户名:" + name);
        out.println("密 码:" + password);
        // 获取参数名为“hobby”的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.print("爱好:");
        out.println("爱好:");
        for (int i = 0; i < hobbys.length; i++) {
            System.out.print(hobbys[i] + ",");
            out.println(hobbys[i] + ",");
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
       //设置response返回输出的编码方式
        response.setContentType("text/html;charset=utf-8");
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("用户名:" + name);
        System.out.println("密 码:" + password);
        PrintWriter out = response.getWriter();
        out.println("用户名:" + name);
        out.println("密 码:" + password);
        // 获取参数名为“hobby”的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.print("爱好:");
        out.println("爱好:");
        for (int i = 0; i < hobbys.length; i++) {
            System.out.print(hobbys[i] + ",");
            out.println(hobbys[i] + ",");
        }

    }
}

亲测完全正确哦,有错误的同学注意查看tomcat的servlet.xml是不是加了多余的配置,或者idea编辑器的字符编码配置有错。

相信认真读到这里,关于中文乱码的问题已经了解

如果对你有所帮助,点赞支持一下作者~

发布了14 篇原创文章 · 获赞 14 · 访问量 1116

猜你喜欢

转载自blog.csdn.net/qq_42495847/article/details/105237768