【JavaEE】如何构造 HTTP请求认识HTTPS

news2025/1/16 16:48:56

✨哈喽,进来的小伙伴们,你们好耶!✨

🛰️🛰️系列专栏:【JavaEE】

✈️✈️本篇内容:如何构造 HTTP 请求同时认识HTTPS!

🚀🚀代码存放仓库gitee:JavaEE代码!

⛵⛵作者简介:一名双非本科大三在读的科班Java编程小白,道阻且长,星夜启程!

通过前两篇博客的学习,我们已经大致了解了http的很多知识了,那么能否通过代码来构造出http请求呢?

答案显然是可以的!我们可以通过客户端来构造http请求,那么最常见的客户端就是浏览器啦!

目录

1、通过 form 表单构造 HTTP 请求

2、通过Ajax构造http请求

什么是Ajax?

什么是异步?什么是同步?

同步和异步的区别?

如何实现不跨域呢?

认识HTTPS;

什么是加密;

加密层SSL/TLS;

1、对称加密;

非对称加密;

总结:新的问题;


1、通过 form 表单构造 HTTP 请求

form ( 表单 ) HTML 中的一个常用标签 . 可以用于给服务器发送 GET 或者 POST 请求;
代码:
<form action="https://www.sogou.com/index.html" method="get">

action:表示要把请求提交给哪个服务器;这里是一个url;

method:表示是按照get来提交;还是按照post来提交;这里的method不区分大小写;

那么光有一个form标签是没法提交的,也没东西可以提交;我们可以搭配一些其他的标签,比如input,让我们可以自己输入一些信息;

    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit" value="提交按钮">

注意这里第一行key 就是“username”,value 就是用户在输入框输入的内容;第二行key 就是“password",value 就是用户在输入框输入的内容;form表单是给服务器提交数据的本质是键值对;此处的name就表示在描述当前输入框对应的key是啥;最后我们给一个提交按钮;

OK,我们运行查看结果;

我们发现有两个输入框,假设我们输入账号123,密码456,点击提交;

红色框框圈起来的后半部分(query string)就表示页面要提交给服务器的数据;

即当前咋们把请求提交给搜狗主页了,但是人家并没有处理咋们的参数;等后面咋们自己写的服务器就可以针对前端提交来的参数进行处理,就可以实现一些不同的功能;

2、通过Ajax构造http请求

那么刚才介绍的form表单的格式是一种比较原始的构造方式,我们也可以看到使用这种形式一定会涉及到页面跳转,即浏览器需要加载出全部的页面,那么如果这个页面非常复杂的话,这种方式就不太理想了!

这个时候,就轮到Ajax上场了;Ajax在上述情况下只需要加载其中需要变化的某个部分即可!

什么是Ajax?

Ajax的全称是Asynchronous JavaScriptand XML; AJAX=异步JavaScript和XML。

Asynchronous这个词叫做异步,还记得之前多线程学习中的同步(synchronized)嘛;

什么是异步?什么是同步?

比如小明去找小红吃饭,小明说我快到了,小红说你在楼下等我一会,马上就来,于是小明就在楼下一直等待,直到小红打扮好下楼,这就叫同步等待;

但是小明觉得在楼下等待太热了,于是他就去一个凉快的地方带着,等小红下来的时候在给他打电话,小明再来找小红,这就叫做异步等待;(可以理解为调用者发起一个请求后就不管了,等被调用者结果出来了,主动通知调用者)

同步和异步的区别?

主要是看这个结果是调用者关注还是被调用者来给调用者主动通知;

那么Ajax就是基于"异步等待"这样的方式进行的;

首先构造一个http请求,发给服务器,但是浏览器不知道服务器啥时候会有响应,于是浏览器干脆不管了,该干嘛干嘛,等服务器的响应回来了之后,在由浏览器通知咋们的js代码,以回调函数的方式来处理响应;

实例演示:

博主这里是通过jQuery的方式来展示;

step1、首先在浏览输入 jQuery cdn按下回车:(图片有点小错误是cdn不是mdn)

 step2:找到如下对应的链接;(http://libs.baidu.com/jquery/2.0.0/jquery.min.js)

 step3:复制粘贴刚才的链接打开;

 step4:ctrl+A全选复制;在我们的VSCode中创建一个新的文件jquery.js把刚才的内容粘贴过来;

 使用jquery的ajax:$

注意 $ 是一个变量名,这个 $ 就是jquery中最核心的对象;jquery中的各种api都是通过 $ 来触发的。

通过 $ 对象来调用Ajax函数,参数只有一个但是是一个对象;

     <script src="jquery.js"></script>
     <script>
        $.ajax({
            type:'get',
            url:'https://www.sogou.com/index.html',
            success:function(body){
                //success对应一个回调函数
                //这个函数就会在正确获取http响应之后,来调用
                //"异步"
                //回调函数的参数就是http响应body的部分
                console.log("获取到响应数据!"+body);
            },
            error:function(){
                //error也对应一个回调函数
                //在请求失败后触发
                //异步
                console.log("获取响应失败!");
            }
        });
    </script>

type表示http请求的方法;url对应http请求的url;注意这里ajax不仅仅支持get和post,也支持put,delete等其他方法;

ajax其他参数可以参考:菜鸟教程jquery ajax!

OK,这个时候我们可以运行程序,来观察效果!

为什么会出现错误呢?这里的原因就是浏览器禁止ajax进行跨域访问,即跨越多个域名/服务器;即当前页面处在的浏览器是本地文件,页面中ajax请求的url域名是www.sogou.com,这样就触发了跨域操作;

如何实现不跨域呢?

即当前页面处在的服务器, 就是在 www.sogou.com 这个服务器中;页面中再通过 ajax 请求 URL,域名为 www.sogou.com 这种就不算跨域;

解决方案:咋们自己有一个服务器,让页面和ajax的地址都是这一个服务器即可,服务器的知识博主后续更新;我们先来学习HTTPS。

认识HTTPS;

HTTPS 也是一个应用层协议 . 是在 HTTP 协议的基础上引入了一个加密层
HTTP 协议内容都是按照文本的方式明文传输的 . 这就导致在传输过程中出现一些被篡改的情况
啥,篡改?什么意思?
我们先来了解一下运营商劫持;
由于我们通过网络传输的任何的数据包都会经过运营商的网络设备(路由器, 交换机等), 那么运营商的网络设备就可以解析出你传输的数据内容, 并进行篡改;
点击 "下载按钮", 其实就是在给服务器发送了一个 HTTP 请求, 获取到的 HTTP 响应其实就包含了该 APP的下载链接;运营商劫持之后, 就发现这个请求是要下载天天动听, 那么就自动的把交给用户的响应给篡改成 "QQ浏览器" 的下载地址了;

如下图所示:

HTTPS 就是在 HTTP 的基础上进行了加密, 进一步的来保证用户的信息安全;

什么是加密;

加密就是把 明文 ( 要传输的信息 ) 进行一系列变换 , 生成 密文
解密就是把 密文 再进行一系列变换 , 还原成 明文
在这个加密和解密的过程中 , 往往需要一个或者多个中间的数据 , 辅助进行这个过程 , 这样的数据称为 密钥
举例说明:比如A要给B发送一份重要的文件,但是如果直接写上信息的话,那么如果被别人中途发现,看到了里面的内容,不就暴露了嘛,于是A和B约定好一种规则,按照这个规则来解读这个信息,这个文件里面A可以写一大把数字用来代表相关信息,比如1代表你,2代表西瓜,3代表奥利奥,那么B收到这个文件就可以根据这个规则来解密这个文件,从而获取到正确的信息;
在这个案例里:
明文:要传输的信息;
密文:整个文件夹;
密钥:数字代表的含义;

加密层SSL/TLS;

SSL:旧的叫法,TLS新的叫法;博主这里统一叫做SSL;
SSL中加密的两种方式;

1、对称加密;

使用同一个密钥,既可以进行加密,也可以进行解密;

如图所示:

这里客户端和服务器持有同一个密钥,客户端传输的数据通过这个密钥对称加密,但是实际传输的是密文!

假设这里黑客中途拦截数据,拿到的也就是密文,黑客看不懂,那么数据不就安全了嘛?

但是注意:这里如何保证客户端和服务器都持有同一个密钥,当一个服务器对应多个客户端的时候,如何处理?

既然需要不同的密钥,就需要让服务器能够记录,不同的客户端的密钥都是什么。同时,也要保证客户端和服务器之间能够传递这个密钥;

于是问题又来了,那么如何解决这个密钥网络传递的安全性?

如图:

假如设备已经被黑客入侵了,如果密钥明文传输的话,也会被黑客拿到,那么后续传输数据,黑客就可以根据这个密钥来解密文件,黑客就能拿到数据了!

这样分析的话,对称加密也不顶事啊;如何解决呢?引入非对称加密!

非对称加密;

非对称加密要用到两个密钥 , 一个叫做 " 公钥 ", 一个叫做 " 私钥 ";
公钥和私钥是配对的 . 最大的缺点就是 运算速度非常慢 ,比对称加密要慢很多
通过公钥对明文加密 , 变成密文 ; 通过私钥对密文解密 , 变成明文 ;
也可以反着用 ;
通过私钥对明文加密 , 变成密文 ; 通过公钥对密文解密 , 变成明文 ;
举例说明:
A 要给 B 一些重要的文件, 但是 B 可能不在. 于是 A 和 B 提前做出约定;
B 说: 我桌子上有个盒子, 然后我给你一把锁, 你把文件放盒子里用锁锁上, 然后我回头拿着钥匙来开锁取文件;
在这个场景中, 这把锁就相当于公钥, 钥匙就是私钥. 公钥给谁都行(不怕泄露), 但是私钥只有 B 自己
持有. 持有私钥的人才能解密;
这个过程看起来很完美,但是,还是有漏洞!
我们来看改进后的客户端服务器咋通信的;

 但是可能会出现以下情况;

即黑客自己也生成一对公钥私钥;拦截到服务器给客户端返回的公钥,用自己生成的公钥,替换之;
黑客拦截到对称密钥的密文之后;由于这个密文是使用 public key2 来进行加密的;因此黑客就可以使用 private key2 进行解密;黑客就拿到了对称密钥和密文888888;紧接着,黑客为了隐藏自己,把888888在使用之前从服务器拿到的 public key 进行加密得到了另外一个密文;

总结:新的问题;

客户端如何获取到公钥?
客户端如何确定这个公钥不是黑客伪造的?
答:引入证书!
上述分析到,如何让客户端辨别这个公钥public key是服务器发过来的;还是黑客伪造的;
在生活中,大家肯定去过网吧,做过高铁火车,那么如何验证我就是本人小明呢?身份证呀!
在这个场景中,身份证就是一个第三方的公信机构,来验证这个公钥的合法性!
如下图所示:

即服务器刚开始上线的时候,都会去公信机构申请一个证书;然后服务器自己生成的公钥,就放在这个证书中!

这个 证书 可以理解成是一个结构化的字符串 , 里面包含了以下信息 :
证书发布机构;证书有效期 ; 公钥 ;证书所有者 ;签名;等……

客户端如何知晓这个证书真伪?

1、判定证书的有效期是否过期 ;
2、判定证书的发布机构是否受信任 ( 操作系统中已内置的受信任的证书发布机构 );
3、验证证书是否被篡改 : 从系统中拿到该证书发布机构的公钥 , 对签名解密 , 得到一个 hash ( 称为 据摘要 ), 设为 hash1. 然后计算整个证书的 hash , 设为 hash2. 对比 hash1 hash2 是否相等如果相等 , 则说明证书是没有被篡改过的

 OK,关于http和https的内容就更新到这里啦,我们下期再见!!

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

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

相关文章

HW在即,那些被遗忘的物理安全还好吗?

近段时间&#xff0c;一个网络攻击的段子在互联网上火了起来。 “某公司被黑客勒索&#xff0c;每20分钟断一次网&#xff0c;给公司带来了极其严重的影响&#xff0c;但通过技术手段怎么也找不到问题。最后公司发现是黑客买通了保安&#xff0c;每20分钟拔一次网线。” 看完…

即时通讯系列---如何设计消息协议层方案

1. 前言 上篇即时通讯系列—如何下手做技术方案设计 最后总结出IM系统的端侧基本结构 后续文章将从下到上以此做架构设计. 本文Agenda 什么是消息同步同步协议的常见设计方案包含哪些应该采用哪种方案方案细节 2. 名词定义: 消息漫游 : 用户如何从消息服务器获取会话和消息…

MITK2021.02编译记录

编译成功效果 编译文件夹 参考教程 https://libaineu2004.blog.csdn.net/article/details/124202508?spm1001.2101.3001.6650.6&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-6-124202508-blog-76460702.pc_relevant_aa2&depth_…

C语言——数据在内存中的存储

C语言——数据的存储一、C语言中常见的数据类型1.1 数据类型的基本归类二. 整型在内存中的存储2.1原码、反码、补码知识回顾2.2大小端字节序2.2.1 何为大小端字节序2.2.2为什么会产生大小端字节序2.2.3练习三、浮点型在内存中的存储3.1浮点数存储规则一、C语言中常见的数据类型…

Java两大工具库:Commons和Guava(5)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客。值此新春佳节&#xff0c;我给您拜年啦&#xff5e;祝您在新的一年中所求皆所愿&#xff0c;所行皆坦途&#xff0c;展宏“兔”&#xff0c;有钱“兔”&#xff0c;多喜乐&#xff0c;常安宁&#xff01;在开发中&#…

C语言最鸡肋的关键字

C语言的关键字有很多&#xff0c;要说最不常见的&#xff0c;我觉得应该是auto。 说它不常见&#xff0c;因为很多时候&#xff0c;我们都把它给省略了。 比如在函数内部定义变量a&#xff0c;正常人都会这样写&#xff1a; void function() {int a; }很少有人会在前面加一个…

1616_MIT 6.828 program header相关只是小结

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 前面刚刚分析了elf的header&#xff0c;看了两行代码又遇到了program的header。又是一个概念类的问题&#xff0c;还得去简单了解下。 1. 这里面的信息其实是可能有…

hgame2023 week2 writeup

WEEK2 文章目录WEEK2web1、Git Leakage2、v2board3、DesignerRE1、before_main2、stream3、VidarCamera4、mathpwn1、YukkuriSay2、editable_note3、fast_note4、new_fast_noteCrypto1、零元购年货商店2、包里有什么3、Rabin3、RSA 大冒险1misc1、Tetris Master2、Sign In Pro …

深入理解Linux网络学习总结

文章目录一、绪论二、内核如何接收网络包1、收包流程的一些核心概念2、网络接收过程总览三、内核如何与用户进程协作1、进程的一些基础概念3、同步阻塞IO工作流程4、epoll工作流程四、内核如何发送网络包1、发包流程的一些基础概念2、网络发送过程总览3、发包流程的内存拷贝操作…

Cnetsdk:PDF 转图像转换器 SDK 大文档轻松转

.NET PDF 到图像转换器 SDK&#xff0c;成熟的PDF转换器 CnetSDK .NET PDF Converter for Images是一个完整的PDF到图像转换解决方案。无需将任何其他 Adob​​e 或 PDF 阅读器安装到您的 .NET 应用程序&#xff08;C# 或 VB.NET&#xff09;&#xff0c;例如 Windows 和 ASP.N…

Cnetsdk.NET PDF 条码阅读器 SDK

.NET PDF 条码阅读器 SDK 易于整合 Cnetsdk.NET PDF 条码阅读器 SDK易于添加和集成到您的 C# 和 VB.NET 应用程序开发中。您只需要将您的 VS .NET 项目引用添加到 CnetSDK .NET PDF Barcode Reader SDK 库 dll。这个独立的 .NET 库与 .NET Framework 2.0、Visual Studio 2005、…

Linux(常用操作+服务器部署项目运行环境的过程记录)

Linux&#xff08;常用操作实例springboot项目&#xff08;包含数据库&#xff09;打包上传&#xff0c;配置到腾讯云轻量级服务器&#xff0c;中间一些错误也记录了解决方法和自己的理解&#xff09; Linux中一切皆文件【文件: 读写执行(查看、创建、删除、移动、复制、编辑)…

java易错题锦集一

易错题 字符串 题一 原题链接 public class Example { String str new String("good"); char[] ch {a,b,c}; public static void main(String[] args) { Example ex new Example(); ex.change(ex.str, ex.ch); System.out.print(ex.str "and"); Syst…

Spring设计模式总结

Spring 框架用到了哪些设计模式&#xff1f; 代理模式 总述 所谓代理&#xff0c;是指它与被代理对象实现了相同的接口&#xff0c;客户端必须通过代理才能与被代理的目标类进行交互&#xff0c;而代理一般在交互的过程中&#xff08;交互前后&#xff09;&#xff0c;进行某…

前端——周总结系列三

1 数组对象使用变量作为key加中括号 2 遍历数组异同 主要针对for…in&#xff0c; for…of &#xff0c;map遍历方法 for…in和for…of都可以遍历数组&#xff0c;其中for…of可以获取数组的每一项&#xff0c;for…in不仅可以获取每一项&#xff0c;也可以获取索引值 for…o…

加油站会员管理小程序实战开发教程06-地图功能开发

上一篇我们主要是讲解了前端搭建的方法,本篇我们介绍一下地图功能的开发。 在我们的原型里在首页需要显示当前加油站距你的距离。计算距离需要我们引入地图的API,在微搭中先需要创建API。 登录控制台,点击APIs,点击新建APIs 选择腾讯地图 这里需要输入API KEY,微搭已经给…

LeetCode 刷题系列 -- 124. 二叉树中的最大路径和

路径 被定义为一条从树中任意节点出发&#xff0c;沿父节点-子节点连接&#xff0c;达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root &…

跟着《代码随想录》刷题(一)——数组

1.1 数组基础理论 &#xff08;1&#xff09;定义&#xff1a;数组是存储在连续内存空间上相同类型数据的集合。 &#xff08;2&#xff09;注意&#xff1a; 数组下标是从0开始的&#xff1b;数组在内存空间的地址是连续的。 >删除或增添数组元素难免要移动其他元素的地…

DynaSLAM-11 DynaSLAM中RGB-D运行流程(Ⅰ):调用Mask 初始化R-CNN网络

目录 1.执行例程rgbd_tum 2.SegmentDynObject::SegmentDynObject方法 3. SegmentDynObject::GetSegmentation 4.初始化SLAM系统 1.执行例程rgbd_tum /home/lhwnb/Desktop/slam/DynaSLAM/Examples/RGB-D/rgbd_tum /home/lhwnb/Desktop/slam/DynaSLAM/Vocabulary/ORBvoc.txt …

多线程与线程池demo

第一步&#xff1a;切割数据的方法 public static List<List<Integer>> getProcessData(Integer batchSize) {List<Integer> originData new ArrayList<>();for (int i 0; i < 100; i) {originData.add(i);}List<List<Integer>> proc…