首页 >> 大全

HttpGet请求与Post请求中参数乱码原因剖析与解决方案

2023-09-08 大全 34 作者:考证青年

1 Get请求

当向服务器发送请求URL的请求时 ::8080/?=张三,通常在服务端中解析的参数值时会获得一串难以解读的字符信息。

1.1 原因解析

Get请求中的请求参数会拼接在请求URL中,当URL中存在中文时,浏览器会对请求URL进行编码,其中编码的时候使用的是UTF-8字符集。服务器解析请求发送的过来的报文时【参数信息主要是解析请求行的信息】采用的是ISO-8859-1字符集。由于编码时和解码时采用的字符集不一致,所以导致了乱码。

ISO-8859-1字符集,属于西欧字符集,支持英文、数字以及标准符号,但是不支持中文字符集。

URL编码是将每个字符按照编码方式转为二进制,每个字节转为2个16进制数并在前边加上%

1.2 代码测试

post请求中文乱码原因__post请求302怎么解决

/*** @Author lyf* @Date 2023/1/11 - 10:43* @Description URL编解码* Get请求乱码的原因分析**/
public class URLDemo {public static void main(String[] args) throws UnsupportedEncodingException {String name="张三";//浏览器采用UTF-8对URL编码String encode = URLEncoder.encode(name, "UTF-8");System.out.println("UTF-8编码"+encode);System.out.println("UTF-8解码"+ URLDecoder.decode(encode, "UTF-8"));//Tomcat服务器使用ISO-8859-1字符集啊对URL进行解码String decode = URLDecoder.decode(encode, "ISO-8859-1");System.out.println("ISO-8859-1解码"+ decode);}
}

控制台输出信息

UTF-8编码%E5%BC%A0%E4%B8%89

UTF-8解码张三

ISO-8859-1解码å¼ ä¸‰

1.3 解决方案

** 值得注意的是,两种不同的字符集底层的字节数组任然是一致的,所以可以考虑先转换成字节 再将字节数组转换为字符串**

  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{//获得参数[存在中文时,utf-8会对其进行编码,服务器端采用的是iso-0859-1进行的解码的信息]//该字符串是iso-0859-1解码后的内容//获得URL中拼接的参数值 usernameString username= req.getParameter("username")//获得iso-0859-1解码下的字节数组byte[]bytes=username.getBytes(StandardCharsets.ISO_8859_1);//字节数组转成字符串,以UTF-8进行编码username=new String(bytes,StandardCharsets.UTF_8);}

值得注意的是,之后已解决Get请求的乱码的情形,设置默认的解码方式为UTF-8。由于req.()方法是Get 、Post获取参数的通用方法。该解决方法同样也使用于Post请求中参数乱码的情况。

2 Post请求

当向服务器发送Post请求时,同时携带参数信息=张三时,与Get请求不同的是,参数不会拼接在请求行中【URL】,而是将参数信息设置在请求体中进行传输。

2.1 原因解析

通常这种字符型的请求体信息,服务器也是通过获得字符数据来进行解析。req.().()。其中()中使用的字符集是ISO-8859-1字符集,不支持中文字符集,因此会乱码。为了解决中文乱码,就需要将ISO-8859-1转换为UTF-8字符集,其中需要将请求和响应报文中的字符集都设置为UTF-8

    @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置输入流的编码req.setCharacterEncoding("UTF-8");//设置输出流的编码resp.setCharacterEncoding("UTF-8");//获得请求参数【post 与 get方法都可以用此方法获得请求参数信息】  ,底层逻辑是通过req.getReader().readLine()去获得请求体中的数据来对参数进行处理的System.out.println(req.getParameter("username"));}

2 总结

以上分析可知,导致乱码的情况可以归纳成输入的字符集与输出的字符集不一致的情况,为了解决乱码的问题,需要将前后的字符集设置成一致。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了