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

 更新时间:2023年07月12日 11:55:39   作者:contact97  
这篇文章主要介绍了HttpGet请求与Post请求中参数乱码原因剖析,文中有相关的代码示例,具有一定的参考价值,需要的朋友可以参考下

1 Get请求

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

1.1 原因解析

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

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

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

1.2 代码测试

/**
 * @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中拼接的参数值 username
    String username= req.getParameter("username")
    //获得iso-0859-1解码下的字节数组
    byte[]bytes=username.getBytes(StandardCharsets.ISO_8859_1);
    //字节数组转成字符串,以UTF-8进行编码
    username=new String(bytes,StandardCharsets.UTF_8);
 }

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

2 Post请求

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

2.1 原因解析

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

    @Override
    protected 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"));
    }

3 总结

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

到此这篇关于HttpGet请求与Post请求中参数乱码原因剖析与解决方案的文章就介绍到这了,更多相关HttpGet请求与Post请求参数乱码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解HBase表的数据模型

    详解HBase表的数据模型

    HBase 是一种列存储模式与键值对存储模式结合的 NoSQL 数据库,它具有灵活的数据模型,不仅可以基于键进行快速查询,还可以实现基于值、列名等的全文遍历和检索,下面给大家介绍HBase表的数据模型,感兴趣的朋友一起看看吧
    2022-05-05
  • 伪静态技术介绍与优缺点分析(较完整篇)

    伪静态技术介绍与优缺点分析(较完整篇)

    伪静态太适合用在普通的企业网站上了——既不要求高并发,但同时又很在乎seo(搜索引擎优化),而且也要求后台可动态更新。
    2009-11-11
  • IntelliJ IDEA运行Tomcat报错:Please, configure Web Facet first!解决办法

    IntelliJ IDEA运行Tomcat报错:Please, configure Web Facet fir

    这篇文章主要介绍了IntelliJ IDEA运行Tomcat报错:Please,configure Web Facet first!的解决办法,文中包括问题现象、常见原因、解决方案(包括普通Web目录结构和Maven标准结构的具体配置)、常见问题排查等部分,需要的朋友可以参考下
    2026-05-05
  • ClaudeCode中的Agent系统工作原理、如何使用和自定义开发

    ClaudeCode中的Agent系统工作原理、如何使用和自定义开发

    本文介绍了ClaudeCode中的Agent系统,包括其工作原理、内置Agent的使用方法、如何创建自定义Agent以及优秀的Agent框架BMAD-Method,通过使用Agent,可以提高开发效率,提升专业知识,并促进团队协作
    2026-03-03
  • Elasticsearch之文档批量操作示例

    Elasticsearch之文档批量操作示例

    这篇文章主要为大家介绍了Elasticsearch之文档批量操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

    C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

    这篇文章主要介绍了C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面讲解的相关资料,这些语言各有特点,适用于不同的开发需求,C++和Rust在系统级和高性能任务中表现出色,而Python和JavaScript则更适合快速原型和Web开发,需要的朋友可以参考下
    2025-12-12
  • 超好用的免费内网穿透工具【永久免费不限制流量】

    超好用的免费内网穿透工具【永久免费不限制流量】

    对于开发人员来讲,演示内网web站点、本地开发微信公众号、小程序开发、调试第三方支付系统对接等开发环境,往往需要一个环境可以进行调试,市面上内网穿透工具有很多,这里推荐一款简单又好用的cpolar,可以永久免费使用,不限制流量,支持http/https/tcp协议
    2022-09-09
  • DDoS攻击多种方式的原理分析和防护方法总结

    DDoS攻击多种方式的原理分析和防护方法总结

    DDoS攻击通过多主机发起海量请求,导致服务器过载,影响服务,攻击方式包括僵尸网络、漏洞利用等,分为SYN flood、ACK flood、UDP flood、反射放大、空连接、CC攻击等,防御手段有云原生、CDN安全、DDOS高防、硬件防护、运营商流量压制
    2025-05-05
  • ceph集群RadosGW对象存储使用详解

    ceph集群RadosGW对象存储使用详解

    这篇文章主要为大家介绍了ceph集群RadosGW对象存储使用详解,有需要的,朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • idea激活码最新获取方法(idea2020激活码汇总)

    idea激活码最新获取方法(idea2020激活码汇总)

    针对idea激活码失效的情况,我们给大家带来最新的idea激活码以及相关激活教程,分享最新idea激活参数等信息。
    2020-02-02

最新评论