第5章 处理GET请求参数

news2024/11/28 18:35:26

1 什么是GET请求参数

        表单GET请求参数是指在HTML表单中通过GET方法提交表单数据时所附带的参数信息。在HTML表单中,可以通过表单元素的name属性来指定表单字段的名称,通过表单元素的value属性来指定表单字段的值。当用户提交表单时,浏览器会将表单字段的名称和值以键值对的形式打包成查询字符串(query string),将查询字符串附加到表单的action URL中作为GET请求的参数信息。

        例如,假设一个简单的表单如下所示:

  <h1>用户注册</h1>
  <form action="/accounts/register" >
    <label>姓名:<input type="text" name="name" placeholder="请输入您的姓名"></label><br>
    <label>密码:<input type="password" name="password" placeholder="请输入密码"></label><br>
    <label>邮箱:<input type="text" name="email" placeholder="请输入邮箱"></label><br>
    <label>性别:<input type="text" name="gender" placeholder="输入性别"></label><br>
    <input type="submit" value="提交">
  </form>

        其中,action属性指定表单提交的目标URL。当填写姓名为“Tom”,密码“1234”,邮箱“tom@demo.com”,性别“男”:

        并且点击"提交"按钮提交表单时,浏览器将发送一个GET请求到"http://localhost:8089/accounts/register "。

        在服务服务器端可以看到如下信息:

        显然请求参数信息包含在uri中。

        由于我们没有在服务端接收这些参数,并且没有进行适当的处理,所以客户端得到了404错误。

2 解析GET请求参数

        解析GET请求参数的过程主要涉及对查询字符串进行解析和处理。通常,服务器端的程序可以通过以下步骤来解析GET请求参数:

        1. 获取URL中的查询字符串部分:对于HTTP GET请求,查询字符串部分位于URL中的问号字符(?)之后,可以通过解析URI来获取该部分的内容。

        2. 解析查询字符串中的键值对:查询字符串中的键值对通常使用等号(=)连接,键值对之间使用和号(&)连接。可以通过字符串分割和循环遍历来解析键值对。

        3. 对键值对的值进行解码:由于URL中的查询字符串部分需要进行URL编码以确保参数值的正确性和安全性,因此在解析时需要对键值对的值进行解码。

        综合上述步骤,我们可以使用Java代码实现GET请求参数的解析。解析过程如下所示:

3 解析GET请求参数的方法

        首先,添加解析请求参数的方法。

        解析请求功能显然是HttpServletRequest对象的职责,重构HttpServletRequest对象,添加解析请求参数的方法:

/** 查询字符串 */
private String queryString;
/** 请求路径 */
private String requestURI;
/** 存储全部参数 */
private HashMap<String, String> parameters = new HashMap<>();
private void parseUri(){
    //使用?拆分请求路径和查询字符串. ?是正则特殊字符,需要使用转义字符
    String[] parts = uri.split("\\?");
    requestURI = parts[0];
    queryString = parts[1];
    //使用&拆分解析查询字符串
    parts = queryString.split("&");
    for (String part : parts) {
        //使用 = 拆分出 name 和 value
        String[] param = part.split("=");
        String name = param[0];
        String value = param[1];
        parameters.put(name, value);
    }
    System.out.println("解析了参数:"+parameters);
}

        在这个解析方法中,假设请求 URI 为 /accounts/register?name=Tom&password=1234&email=tom%40demo.com&gender=%E7%94%B7,解析代码将分解成以下步骤达成目的:

        1、使用 split() 方法将 URI 拆分成两个部分,即请求路径和查询字符串。由于 ? 是一个正则特殊字符,因此需要使用转义字符 \\? 进行拆分。因此,parts 数组中将包含 "/accounts/register" 和 " name=Tom&password=1234&email=tom%40demo.com&gender=%E7%94%B7" 两个元素。

        2、将parts第一个元素存储到 requestURI 变量中。

        3、将parts第二个元素存储到 queryString 变量中。

        4、使用 split() 方法将查询字符串 queryString 拆分成多个参数。在这个示例中,使用 & 进行拆分,将得到一个包含四个元素的 parts 数组,分别是 "name=Tom"、" password=1234"、“email=tom%40demo.com”和gender=%E7%94%B7。

        5、对于每个参数,使用 split() 方法将参数名称和参数值拆分开。在这个示例中,使用 = 进行拆分。

        6、将每个参数名称和参数值存储到 parameters HashMap 中。

        7、输出map集合,检查解析是否成功了。

        然后,重构解析请求行方法 parseRequestLine:在uri中有?时候调用parseUri()方法对uri中的参数进行进一步的解析:

//解析请求行中的请求参数
if (uri.contains("?")){
    parseUri();
}else{
    requestURI = uri;
}

4 GET请求编码问题

        上述解析URL功能,接收到的中文和特殊字符会出现“乱码”,这个问题并不是乱码,而是HTTP协议通过URL传输数据时候,对特殊字符(中文)进行了编码。

        URL参数需要进行编码,是因为URL中只能包含特定的字符集,如字母、数字和一些特殊字符(中文),其他字符如果直接包含在URL中可能会导致URL无法正确解析或者出现意外的结果。因此,为了避免这种情况发生,需要对URL参数进行编码,以便在传输过程中对其进行安全的转换和传递。

        URL编码(也称百分号编码或URL转义):将URL参数中的非法字符转换成%xx的形式,其中xx是表示字符ASCII码值的16进制数字,例如空格的ASCII码值是32,因此用%20来表示空格。

        下面是一个URL参数编码的示例,假设要传递参数"Hello, World!",使用URL编码后的结果为:"Hello%2C%20World%21"。浏览器在发送数据时候,对数据进行了URL编码,服务端收到的就是这些“乱码”,只要进行对应的解码即可。

5 使用Java API对URL编码数据进行解码

        URL解码是将经过编码后的URL参数还原成原始数据的过程。URL解码的目的是为了恢复URL参数的原始含义,使得URL能够正确地被服务器解析和处理。

        URL解码(也称百分号解码或URL反转义):将URL参数中的%xx还原成对应的ASCII字符。例如,%20表示空格,将其解码后得到空格字符。

        Java API 提供了URLDecoder.decode()方法,对URL编码的数据进行解码:

  • 第一个参数为需要解码的URL参数
  • 第二个参数为字符编码方式:通常使用UTF-8
  • 输出解码后的结果

        下面是一个使用Java API对URL编码数据进行解码的示例,假设需要解码的URL参数为"Hello%2C%20World%21":

import java.net.URLDecoder;

public class URLDecoderExample {
   public static void main(String[] args) {
      try {
         String encodedURL = "Hello%2C%20World%21";
         String decodedURL = URLDecoder.decode(encodedURL, "UTF-8");
         System.out.println("Encoded URL: " + encodedURL);
         System.out.println("Decoded URL: " + decodedURL);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

        输出结果为:

Encoded URL: Hello%2C%20World%21

Decoded URL: Hello, World!

        在示例中,首先使用URLDecoder.decode()方法对URL编码的数据进行解码。该方法的第一个参数为需要解码的URL参数,第二个参数为字符编码方式,通常使用UTF-8,最后输出解码后的结果。

6 HttpServletRequest添加参数解码功能

        继续重构HttpServletRequest的parseUri方法,将收到的请求数据进行URL解码,这样就可以解决特殊字符以及中文参数解码问题。

        代码示意如下:

private void parseUri() throws UnsupportedEncodingException {
    //使用?拆分请求路径和查询字符串. ?是正则特殊字符,需要使用转义字符
    String[] parts = uri.split("\\?");
    requestURI = parts[0];
    queryString = parts[1];
    //使用&拆分解析查询字符串
    parts = queryString.split("&");
    for (String part : parts) {
        //使用 = 拆分出 name 和 value
        String[] param = part.split("=");
        String name = param[0];
        String value = URLDecoder.decode(param[1], "UTF-8");
        parameters.put(name, value);
    }
    System.out.println("解析了参数:"+parameters);
}

        在对接收参数进行URL解码后,在表单中添入中文,在服务端就能接收到正确结果了:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1670652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】有关栈和队列相互转换问题

文章目录 用队列实现栈思路实现 用栈实现队列思路实现 用队列实现栈 Leetcode-225 用队列实现栈 思路 建立队列的基本结构并实现队列的基本操作 这部分这里就不多说了&#xff0c;需要的可以看笔者的另一篇博客 【数据结构】队列详解(Queue) 就简单带过一下需要实现的功能 …

金融业开源软件应用 评估规范

金融业开源软件应用 评估规范 1 范围 本文件规定了金融机构在应用开源软件时的评估要求&#xff0c;对开源软件的引入、维护和退出提出了实现 要求、评估方法和判定准则。 本文件适用于金融机构对应用的开源软件进行评估。 2 规范性引用文件 下列文件中的内容通过文中的规范…

数据科学:使用Optuna进行特征选择

大家好&#xff0c;特征选择是机器学习流程中的关键步骤&#xff0c;在实践中通常有大量的变量可用作模型的预测变量&#xff0c;但其中只有少数与目标相关。特征选择包括找到这些特征的子集&#xff0c;主要用于改善泛化能力、助力推断预测、提高训练效率。有许多技术可用于执…

【kettle012】kettle访问FTP服务器文件并处理数据至PostgreSQL(已更新)

1.一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下FTP服务器相关知识体系 3.欢迎批评指正,跪谢一键三连! kettle访问FTP服务器文件并处理数据至PostgreS…

【Unity UI系统介绍】

Unity UI系统介绍 想了解更多游戏开发知识,可以扫描下方二维码,免费领取游戏开发4天训练营课程 Unity UI 是 Unity 引擎中的一套用户界面&#xff08;UI&#xff09;系统&#xff0c;允许开发者创建和管理游戏的用户界面。 Canvas&#xff1a;Canvas 是 Unity UI 的核心组件…

如何3分钟快速训练一个属于自己的(暴躁老哥、猫娘)AI大模型?(弱智吧经典问题为例)

首先我们进入谷歌Gemini&#xff1a;Gemini - Google DeepMind 然后我们进入官网看见左边的几个选项 选择Create new prompt创建新的提示 选择结构化提示 点击action可以增加列&#xff0c;也就是设置更多回答或者选项 那么那个温度&#xff08;Temperature&#xff09;是什么…

二、安装、使用Grafana

目录 一、安装Grafana 二、使用grafana 一、安装Grafana 官网&#xff1a;https://grafana.com/ 账号&#xff1a;admin 密码&#xff1a;xxxxxx [rootrabbitmq_2 prometheus]# [rootrabbitmq_2 prometheus]# wget https://dl.grafana.com/enterprise/release/grafana-enter…

redis安装与群集

项目需求&#xff1a; 1.安装redis 2.测试redis性能&#xff0c;100个并发连接&#xff0c;100000个请求测试 3.在当前数据库下创建键值对 a11,a22,a33,a44&#xff0c;a55 4.查看键值对 5.将a1改名为a11,将a2删除 5.将a3移动到1号数据库 6搭建redis集群(可选) 测试环境…

第六十节 Java设计模式 - 过滤器/标准模式

Java设计模式 - 过滤器/标准模式 过滤器模式使用不同的条件过滤对象。 这些标准可以通过逻辑操作链接在一起。 过滤器模式是一种结构型模式。 例子 import java.util.List; import java.util.ArrayList;class Employee {private String name;private String gender;private…

【Spring】Springmvc学习Ⅲ

# Spring&#xff4d;vc学习Ⅲ 文章目录 一、图书管理系统1. 功能1.1 登录前端接口前端代码后端接口后端代码 1.2 图书列表展示步骤:图书类代码mock数据代码控制层调用代码服务层代码&#xff08;存储除数据库中需要存储的数据&#xff09; 2. 分层控制2.1 三层架构2.2 代码重…

C语言实现简单的日历功能

开篇 本篇文章的题目来源于《编程珠玑》第三章课后习题的第四个问题&#xff0c;也是我会手动实现的本章的最后一个功能。 问题概要 给定月和年&#xff0c;使用字符数组生成该月的日历&#xff08;含有周几的日历&#xff09;。 思路分析 为了生成给定年份中某个月的日历&…

【光线重塑技术】小姐姐,美得不可方物——lllyasviel/ic-light

在英伟达自18年宣布光追技术之后&#xff0c;RTX显卡也成了目前Steam游戏的常客。就连 AMD、Intel 和 Apple Silicon 都宣布要在GPU上支持光追算法。这次我要介绍的是huggingface上比较火的relight技术—— ic-light 介绍 IC-Light 是一个操纵图像照明的项目。 IC-Light &qu…

商务分析方法与工具(十):Python的趣味快捷-公司财务数据最炫酷可视化

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

【FreeRTOS 快速入门】-- 1、STM32工程移植FreeRTOS

目录 一、新建STM32工程 为了示范完整的移植过程&#xff0c;我们从0开始&#xff0c;新建一个标准的STM32点灯工程。 &#xff08;本篇以CubeMX作示范&#xff0c;CubeIDE操作近同&#xff0c;可作对比参考&#xff09; 1、新建工程 选择 芯片型号 新建工程 2、搜索芯片型号…

Pytest自动化测试框架完美结合Allure

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 简介 Allure Framework是一种灵活的、轻量级、多语言测试报告工…

weblogic [WeakPassword]

一、漏洞描述 开放了wblogic端口&#xff0c;进去发现有任意读取文件漏洞&#xff0c;配合解密工具读出密码&#xff0c;登录后台传入webshell 二、影响版本 当前版本 三、影响组件 weblogic 四、漏洞判断 hello/file.jsp?path/etc/passwd 发现有任意文件下载 五、漏洞…

C++牛客周赛题目分享(2)小红叕战小紫,小红的数组移动,小红的素数合并,小红的子序列求和

目录 ​编辑 1.前言 2.四道题目 1.小红叕战小紫 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思路 2.小红的数组移动 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思路 3.小红的素数合并 1.题目描述 2.输入描述 3.输出描述 4.示例 5.题解与思…

2024年淘宝天猫618超级红包领取口令活动时间是从什么时候开始到几月几号结束?

2024年淘宝天猫618活动&#xff0c;将于2024年5月19日开始&#xff0c;今年618淘宝天猫取消了预售环节。同时&#xff0c;618淘宝天猫也提供了多项优惠活动&#xff1a;超级红包、跨店满减、官方立减、全程价保及草柴APP领优惠券拿购物返利等多重优惠活动。 2024年淘宝天猫618…

【C语言】指针(一)

目录 一、内存 1.1 ❥ 理解内存和地址的关系 1.2 ❥ 编址 二、指针变量 2.1 ❥ 取地址操作符&#xff08;&&#xff09; 2.2 ❥ 指针变量和解引用操作符&#xff08;*&#xff09; 2.3 ❥ 指针变量的大小 三、指针类型的意义 3.1 ❥ 指针的解引用 3.2 ❥ 指针-整数 3…

智能制造装备业项目数字化管理之项目模板管理

智能制造装备&#xff0c;作为工业4.0的核心组成部分&#xff0c;正日益受到全球制造业的关注。这类装备融合了信息技术和制造技术&#xff0c;旨在提高生产效率、降低成本并增强产品的个性化。然而&#xff0c;随着智能制造装备行业的飞速发展&#xff0c;项目管理复杂性也在不…