【JavaEE】HTTP 协议

发布于:2024-05-18 ⋅ 阅读:(144) ⋅ 点赞:(0)

一、HTTP 协议

1、HTTP 是什么

2、理解 “应用层协议”

3、理解 HTTP 协议的工作过程

4、HTTP 协议格式

5、HTTP 请求 (Request)

5.1 认识 URL

6、

二、HTTPS

1、HTTPS是什么

HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层。
HTTP协议内容是按照文本的方式明文传输的,这就导致传输过程中出现一些被篡改的情况。

臭名昭著的 “运营商劫持”

下载一个 天天动听
未被劫持的效果, 点击下载按钮, 就会弹出天天动听的下载链接.

已被劫持的效果, 点击下载按钮, 就会弹出 QQ 浏览器的下载链接

例如:在浏览器上下载软件,相信很多同学都经历过在浏览器上面下载东西但是下载的却不是自己想要下载的,下载下来却变成了其他的软件,这就是传输内容被篡改了。

由于我们通过网络传输的任何数据包都会经过运营商的网络设备(路由器,交换机等),那么运营商的网络设备就可以解析我们的传输内容,并进行篡改。

点击下载天天动听,就是给服务器发送一个 HTTP 请求,获取到的HTTP响应包含了改APP的下载地址,运营商劫持后发现这个响应是下载天天动听,自动将返回给用户的响应篡改成QQ浏览器的下载地址。


不止运营商,黑客也可以用类似的手段来获取用户信息,或者篡改内容,如果用户的账户信息甚至支付密码,所以,在互联网上,明文传输是很危险的事情。

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

2、“加密” 是什么

加密 就是把明文(传输内容)进行一系列的变换,转换成密文,
解密 就是把密文进行一系列的变换,转换成明文。
在加密和解密的过程中,需要一个或多个中间数据,辅助进行这个过程,这样的数据被称为密钥(yue)。

加密解密到如今已经发展成一个独立的学科:密码学,而密码学的奠基人,也正是计算机科学的祖师爷之一,艾伦·麦席森·图灵。

3、HTTPS 的工作过程

既然要保证数据安全,那就要进行 “加密”,
网络传输中不再直接使用明文,而是使用加密之后的 “密文”,
加密的方式有很多,但总得来说分为两大类:对称加密非对称加密

3.1 对称加密

对称加密就是通过同一个 “密钥”,把明文加密成密文,也能把密文解密成明文。

一个简单的对称加密, 按位异或
假设 明文 a = 1234, 密钥 key = 8888
则加密 a ^ key 得到的密文 b 为 9834.
然后针对密文 9834 再次进行运算 b ^ key, 得到的就是原来的明文 1234.
(对于字符串的对称加密也是同理, 每一个字符都可以表示成一个数字)
当然, 按位异或只是最简单的对称加密. HTTPS 中并不是使用按位异或.


引入对称加密之后, 即使数据被截获, 由于黑客不知道密钥是啥, 因此就无法进行解密, 也就不知道请求的真实内容是啥了。

但是,服务器同一时间给很多客户端提供服务,每个人的密钥都是不相同(如果一样,那么密钥很容易扩散,黑客也能拿到),因此服务器需要维护每个客户端和每个密钥之间的关联关系,这是一个很庞大的工程。

比较理想的做法是,在客户端和服务器建立连接的时候,双方协商好这次的密钥。

但是如果密钥也进行明文传输的话,那么黑客也能获取密钥并对传输内容进行解密,所以密钥的传输也需要进行加密。想要对密钥进行加密,双方仍旧需要约定一个密钥,但是这就形成了套娃过程,传输内容需要加密,密钥需要加密,密钥的密钥又需要加密…此时密钥的传输用对称加密就行不通了~

此时需要引入非对称加密。

3.2 非对称加密

非对称加密需要两个密钥:“公钥” 和 “私钥”
公钥和私钥是配对的,最大的缺点是:运算速度非常慢,比对称加密慢得多

加密方式1:

  • 通过公钥对明文进行加密,变成密文
  • 通过私钥对明文进行解密,变成明文

加密方式2:

  • 通过私钥对明文进行加密,变成密文
  • 通过公钥对明文进行解密,变成明文

公钥谁都可以持有,不怕泄密,但是私钥只有服务器可以有,只有持有私钥的人才可以解密。

  1. 客户端生产对称密钥,通过公钥进行加密传输,发送给服务器
  2. 由于中间设备没有私钥,即使截获到加密的对称密钥也不知道里面的对称密钥是什么
  3. 服务器通过私钥对加密的对称密钥进行解密,获取到对称密钥,并且使用这个对称密钥加密给客户端返回响应数据。此时知道对称密钥的只有客户端和服务器两个设备,中间设备不知道对称密钥。
  4. 后续客户端和服务器的通信就只用对称密钥就好了,由于改对称密钥只有客户端和服务器两个设备知道,其他设备不知道密钥即使截获也不知道加密内容是什么。

由于对称加密的速度比非对称加密的速度快得多,所以一般只在开始阶段协商密钥的加密使用非对称加密,后续传输都使用对称加密。

那么接下来问题又来了:
1、客户端如何获取到公钥?
2、客户端如何确定这个公钥不是黑客伪造的?

3.3 证书

在客户端-服务器刚建立连接的时候,服务器就给客户端返回一个证书
证书里面包含公钥,也包含了网站的身份信息。

3.4 完整过程

左侧为客户端做的事情,右侧是服务器做的事情。

4、总结

HTTPS 工作过程中涉及三组密钥:

三、Tomcat

Tomcat 最大的用途是可以把写好的代码放进入,然后通过浏览器进行访问。
Tomcat 目录中我们最关注的目录是 webapps,web applications 的简称,意思是用来存放 web 应用的文件夹。

理解 web 应用
一个具有独立完整功能的网站,我们就可以称为 “web 应用”
例如淘宝网,具有电商功能;
一个 Tomcat 上可以部署多个这样的网站,这些网站以目录形式放在 webapps 目录里

每个文件夹对应一个 web 应用,可以在浏览器里面分别访问每个应用

1、Tomcat 下载

Tomcat 的下载我已在另一篇文章中详细描述:https://blog.csdn.net/2301_79765510/article/details/138726742

2、启动服务器

在 bin 目录中,双击 startup.bat,黑色弹框中出现以下红色方框中的标志,则表示 tomcat 启动成功。

注意:在 Windows 通过 cmd 的方式启动 Tomcat 会出现乱码,但不影响 Tomcat 的使用
出现乱码的原因是 Tomcat 默认按照 UTF-8 的编码方式处理中文 ,而 Windows 的 cmd 编码方式是 GBK
如果使用 Linux 或 IDEA 终端启动 Tomcat,则不会出现乱码

在浏览器输入 127.0.0.1:8080,出现 Tomcat 欢迎页面
在这里插入图片描述

3、部署静态页面

静态页面:指内容始终固定的页面,即使用户不同/时间不同/输入的参数不同,页面内容也不会改变,这就是静态页面。
例如:Tomcat 的主页 https://tomcat.apache.org/ 就是静态页面

b站的主页 https://www.bilibili.com/ 就是动态页面

3.1 部署单个 HTML

可以把自己写好的 HTML 部署到 Tomcat 中
创建 hello.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        hello
    </div>
</body>
</html>

将 hello.html 拷贝到 Tomcat 的 webapps/ROOT 目录下

在浏览器通过 URL 127.0.0.1:8080/hello.html 访问

注意:127.0.0.1:8080 是环回 IP,表示当前主机

3.2 部署带有 CSS / JavaScript / 图片 的 HTML

创建 hello.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div>
        hello
    </div>
</body>
</html>

创建 style.css

div{
    color: green;
    font-size: 50px;
}

将 style.css 同样拷贝到 Tomcat 的 webapps/ROOT 目录下

在浏览器通过 URL 127.0.0.1:8080/hello.html 访问

3.3 部署 HTML 到单独的目录中

实际开发中我们不可能只有一个 HTML ,依赖的CSS/JavaScrip 文件也有很多个,这个时候全部放在 webapps/ROOT 中不合适了,
我们可以单独创建一个目录,和 ROOT 并列,来存放我们要部署的内容

  1. 在 webapps 中创建目录 HelloApp,和 ROOT 并列

  2. 将 hello.html 和 style.css 拷贝到 HelloApp 目录中

  3. 在浏览器中通过 http://127.0.0.1:8080/HelloApp/hello.html 访问

3.4 部署“博客系统”页面

将之前写过的博客系统部署到 Tomcat 中

  1. 创建 blog_system 目录

  2. 将 css / js / html / 图片 等内容拷贝到 blog_system 目录中

  3. 在浏览器通过 http://127.0.0.1:8080/blog_system/blog_list.html 即可访问博客列表页


网站公告

今日签到

点亮在社区的每一天
去签到