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

这篇具有很好参考价值的文章主要介绍了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字符集,属于西欧字符集,支持英文、数字以及标准符号,但是不支持中文字符集。

post请求中文乱码,web开发,java,servlet,tomcat

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"));

    }

2 总结

以上分析可知,导致乱码的情况可以归纳成输入的字符集与输出的字符集不一致的情况,为了解决乱码的问题,需要将前后的字符集设置成一致。文章来源地址https://www.toymoban.com/news/detail-538206.html

到了这里,关于HttpGet请求与Post请求中参数乱码原因剖析与解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中的POST请求参数

    在HTTP协议中,GET和POST是两种常用的请求方法。GET请求通过URL参数将请求数据传递给服务器,而POST请求则通过请求体中的参数传递数据。POST请求通常用于提交表单、上传文件等操作。POST请求参数就是请求体中的参数。 在Python中,我们可以使用第三方库如requests来发送POST请求

    2024年01月24日
    浏览(47)
  • SpringBoot - Post请求-接收参数

    1、下面样例 Controller 接收 form-data 格式的 POST 数据: 2、下面是一个简单的测试样例: 1 、如果没有传递参数   Controller   将会报错,这个同样有如下两种解决办法: 使用  required = false  标注参数是非必须的。 使用   defaultValue   给参数指定个默认值。 2、下面是一个简

    2024年02月08日
    浏览(84)
  • 使用HttpURLConnection发送POST请求并携带请求参数

    这里的param是请求参数,需要将其转换为字节数组后写入输出流。 这里的response是响应数据,需要将其读取为字符串后使用。 完整的示例代码如下所示: 需要注意的是,以上示例代码中的请求参数是以字符串形式传递的,如果需要传递复杂的请求参数,可以考虑使用JSON等格

    2024年02月04日
    浏览(53)
  • Java实现post请求(带有参数)

    pom文件所需依赖,有些依赖不是必需的,这里没有删除

    2024年02月12日
    浏览(54)
  • nodejs接收post请求的参数

    post请求参数不直接在url路径中拼接,而是放在请求体中发送给服务器 请求三要素:请求行、请求头、请求体 post请求参数不能直接在url路径中拼接,所以一般使用ajax请求来发送post请求参数 通常都是提交form表单数据使用post请求 1.2-服务端接收post请求参数的方式 与get请求不同

    2024年02月02日
    浏览(38)
  • 获取post中的请求参数1

    POST 请求的参数一般通过 body 传递给服务器. body 中的数据格式有很多种. 如果是采用 form 表单的形式, 可以通过 getParameter 获取参数的值. 创建类PostParameter 创建post_text.html 结果:可以看到传入的数据 1.如果 POST 请求中的 body 是按照 JSON 的格式来传递, 那么通过 getParameter 就获取

    2024年01月23日
    浏览(36)
  • JAVA-POST请求多个参数

    用类似GET方式拼接参数,自行动态拼接.格式固定 有的工具类用的NameValuePair这种类型.也不知道是啥玩,大致理解跟Map差不多,K,V结构.加个List泛型就能传多个参数了 第二种的变形封装,简便

    2024年02月15日
    浏览(41)
  • Flutter携带JSON参数post请求

    在Flutter中发送带有JSON参数的网络请求,你可以使用HTTP库(如 http 或 dio )来实现。以下是使用 http 库发送网络请求并携带JSON参数的示例: 在上述示例中,首先创建一个参数Map,并将其转换为JSON字符串。然后设置请求头,使其指明请求类型为JSON。最后使用 http.post() 方法发送

    2024年02月14日
    浏览(50)
  • postman进行post、get参数传递及中文乱码和各类型参数传递和json格式传参和日期型参数传递和响应数据传回

    postman是一种测试工具 用postman直接在其上输入参数名和参数值就行,不用区分post和get请求方法,当然java代码要改变一点,在响应注解的方法里面添加和postman中输入的参数名一样的形参 get请求: 代码:注意在响应注解的方法里面新添加了形参,其就对应着上面图片中的参数

    2024年02月07日
    浏览(54)
  • okhttp post请求 header post参数加密遇到的两个问题

    如果你对于网络请求用了https后是否还有必要对参数加密有疑问可以看我上篇的文章:网络安全https 记得耐心看完,下面说问题: Caused by: java.lang.IllegalArgumentException: Unexpected char 0x0a 一开始以为是okhttp框架对特殊字符做了现在,网上其他文章说的是对中文字符,我想我这也没

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包