GTE请求与POST请求乱码原因及解决

基于Servlet的GET和POST请求,通过getParameter()方法获取到前端网页提交的数据会出现中文乱码情况。

GTE与POST情况不同,分开讨论。

一、POST请求

原因:

POST请求时,该方法获取参数值时是通过输入流获取,tomcat默认该流的编码为“ISO-8859-1”(页面中的文字信息是用“UTF-8”编码的),因此就出现了中文乱码。

解决:

我们只要手动设置该流的编码为“UTF-8”即可(在读取数据前)。

        // POST请求解决乱码:设置字符输入流的编码
        req.setCharacterEncoding("UTF-8");

        String name = req.getParameter("name");
        System.out.println(name);

        resp.setHeader("Content-Type", "text/html;charset=UTF-8");
        resp.getWriter().write("<h1>"+name+",欢迎您!</h1>");

效果:

二、GET请求

相比于POST,GET请求的原因较为复杂。

POST获取参数使用流,但GET不是,而是通过getQueryString获取。

剖析:

我们在前端页面输入“暴龙战士”后,浏览器会将这四个字传给Tomcat服务器,但浏览器不支持中文,因此浏览器会先将中文编码(采用url编码,形式为“%”+两个十六进制数),然后将该url编码传送给Tomcat,Tomcat再对该url编码进行解码,倘若Tomcat也采用url对该编码进行解码,亦可还原信息,但是Tomcat默认采用“ISO-8859-1”,这样就造成了信息不对等。那既然这样,只要我们更改Tomcat的解码方式,不就行了吗?不行哈,该方法的底层解码方式是写死的,我们不能改。

那为什么当我们采用GET请求方式发送请求时可以在url路径中看到中文呢?如下:

因为当前市场上的主流浏览器都对url编码进行了解码,可以方便我们阅读,(有些浏览器就不会,譬如IE)但当它发送时,发送的还是乱码:

这一块内容都是浏览器为我们做的,即url编码

  // URL编码
String encode = URLEncoder.encode(name, "UTF-8");
System.out.println(encode);
  // URL解码
String decode = URLDecoder.decode(encode, "UTF-8"); // Tomcat在这一环节未使用“UTF-8”而使用"ISO-8859-1"导致出现了差错
System.out.println(decode);

解决:

由于编码、解码的方式不一样导致了出错,我们只需要拿到数据,将其转换成二进制数,再将其编码成字符串,就可以啦。

        String name = req.getParameter("name");
        System.out.println(name);

        // 转换字节数据
        byte[] bytes = name.getBytes("ISO-8859-1"); // 我们拿到的数据用的"ISO-8859-1"

        // 字节数组转换成字符串
        String s = new String(bytes, "UTF-8"); // 将该字节组以"UTF-8"形式转换成字符串
        System.out.println(s);

效果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值