✨哈喽,进来的小伙伴们,你们好耶!✨
🛰️🛰️系列专栏:【JavaEE】
✈️✈️本篇内容:如何构造 HTTP 请求同时认识HTTPS!
🚀🚀代码存放仓库gitee:JavaEE代码!
⛵⛵作者简介:一名双非本科大三在读的科班Java编程小白,道阻且长,星夜启程!
通过前两篇博客的学习,我们已经大致了解了http的很多知识了,那么能否通过代码来构造出http请求呢?
答案显然是可以的!我们可以通过客户端来构造http请求,那么最常见的客户端就是浏览器啦!
目录
1、通过 form 表单构造 HTTP 请求
2、通过Ajax构造http请求
什么是Ajax?
什么是异步?什么是同步?
同步和异步的区别?
如何实现不跨域呢?
认识HTTPS;
什么是加密;
加密层SSL/TLS;
1、对称加密;
非对称加密;
总结:新的问题;
1、通过 form 表单构造 HTTP 请求
<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;
我们先来了解一下运营商劫持;由于我们通过网络传输的任何的数据包都会经过运营商的网络设备(路由器, 交换机等), 那么运营商的网络设备就可以解析出你传输的数据内容, 并进行篡改;点击 "下载按钮", 其实就是在给服务器发送了一个 HTTP 请求, 获取到的 HTTP 响应其实就包含了该 APP的下载链接;运营商劫持之后, 就发现这个请求是要下载天天动听, 那么就自动的把交给用户的响应给篡改成 "QQ浏览器" 的下载地址了;
如下图所示:
即HTTPS 就是在 HTTP 的基础上进行了加密, 进一步的来保证用户的信息安全;
什么是加密;
在这个案例里:明文:要传输的信息;密文:整个文件夹;密钥:数字代表的含义;
加密层SSL/TLS;
1、对称加密;
使用同一个密钥,既可以进行加密,也可以进行解密;
这里客户端和服务器持有同一个密钥,客户端传输的数据通过这个密钥对称加密,但是实际传输的是密文!
假设这里黑客中途拦截数据,拿到的也就是密文,黑客看不懂,那么数据不就安全了嘛?
但是注意:这里如何保证客户端和服务器都持有同一个密钥,当一个服务器对应多个客户端的时候,如何处理?
既然需要不同的密钥,就需要让服务器能够记录,不同的客户端的密钥都是什么。同时,也要保证客户端和服务器之间能够传递这个密钥;
于是问题又来了,那么如何解决这个密钥网络传递的安全性?
如图:
假如设备已经被黑客入侵了,如果密钥明文传输的话,也会被黑客拿到,那么后续传输数据,黑客就可以根据这个密钥来解密文件,黑客就能拿到数据了!
这样分析的话,对称加密也不顶事啊;如何解决呢?引入非对称加密!
非对称加密;
但是可能会出现以下情况;
即黑客自己也生成一对公钥私钥;拦截到服务器给客户端返回的公钥,用自己生成的公钥,替换之;
黑客拦截到对称密钥的密文之后;由于这个密文是使用 public key2 来进行加密的;因此黑客就可以使用 private key2 进行解密;黑客就拿到了对称密钥和密文888888;紧接着,黑客为了隐藏自己,把888888在使用之前从服务器拿到的 public key 进行加密得到了另外一个密文;
总结:新的问题;
即服务器刚开始上线的时候,都会去公信机构申请一个证书;然后服务器自己生成的公钥,就放在这个证书中!
客户端如何知晓这个证书真伪?
OK,关于http和https的内容就更新到这里啦,我们下期再见!!