http协议的请求和响应丶https和密码学基础

http协议的特性

①http协议是建立在TCP/IP协议之上应用层协议,默认端口为80,8080
②http协议的的特点是数据交互时才连接,其余时间都处于断开状态。

http协议的请求

http协议的报文传输的是ASCII码,在TCP/IP协议之上,主要主要分为三部分:请求行、请求头、请求内容

理解get和post两种请求方法的区别——GET(完整请求一个资源)、POST(提交表单)
GET 请求
在这里插入图片描述

当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号‘?’代表URL的结尾与请求参数的开始,传递参数长度受限制。
例如,/index.jsp?id=100&op=bind。通过GET方式传递的数据直接放在地址中,所以GET方式的请求一般不包含“请求内容”部分,请求数据以地址的形式表现在请求行。地址中‘?’之后的部分就是通过GET发送的请求数据,各个数据之间用‘&’符号隔开。显然这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。如果数据是英文字母/数字,原样发送;如果是空格,转换为‘+’;如果是中文/其他字符,则直接把字符串用BASE64加密,得出:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

POST请求
在这里插入图片描述

允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中(URL不带参数)。POST方式请求行中不包含数据字符串,这些数据保存在“请求内容”部分,各数据之间也是使用‘&’符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。

请求行

请求行分为三个部分:请求方法、请求地址URL和HTTP协议版本,它们之间用空格分割。例如,GET /index.html HTTP/1.1

URL
在这里插入图片描述

请求头

浏览器向服务器发送一些状态数据,标识数据等等
由“信息名:+信息值”组成一对,每行一对,信息名和信息值之间使用冒号分隔。
请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据。

请求数据

是代理端向服务器发送的请求数据

POST方式有请求数据,就是把GET方式的URL中的参数作为请求数据。所以POST方法中请求行的URL是不带参数的

POST和GET的区别

  1. 参数位置(url可见性)

get,url参数可见; post,url参数不可见

当不携带参数的时候,两者最大的区别为第一行方法名不同:

POST /uri HTTP/1.1 
GET /uri HTTP/1.1 

当携带参数的时候,我们都知道 GET 请求是放在 url 中,POST 则放在 body 中 :

GET 方法简约版报文

GET /index.html?name=qiming.c&age=22 HTTP/1.1
Host: localhost

POST 方法简约版报文

POST /index.html HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length:25

name=qiming.c&age=22

一般post会比get多两个请求头:Content-Length和Content-Type

  1. 数据传输上

get,通过拼接url进行传递参数;

post,通过body体(请求内容)传输参数

  1. 缓存性

get请求是可以缓存的

post请求不可以缓存

  1. 后退页面的反应

get请求页面后退时,不产生影响

post请求页面后退时,会重新提交请求

  1. 传输数据的大小

get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)

post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。

  1. 安全性

这个也是最不好分析的,原则上post肯定要比get安全,毕竟传输参数时url不可见,但也挡不住部分人闲的没事在那抓包玩。
只有使用 HTTPS 才能加密安全

本质区别:

GET产生一个TCP数据包;POST产生两个TCP数据包。

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 OK(返回数据)

http协议的响应

响应包括:响应行、响应头、响应体(响应数据)

HTTP/1.1 200 0K
Date: Tue,19 Nov 2013 03:08:55 GMT
Server: Apache/2. 2.22 (Win32) PHP/5.3. 13
X- -Powered -By: PHP/5. 3.13
Content-Length: 16
Content- Type: text/html

“响应体”

响应行

状态行由3部分组成,分别为:协议版本、状态码、状态消息。其中协议版本与请求报文一致,状态消息是对状态码的简单描述。

典型的:

1xx:消息 Continue
2xx:成功 OK

3xx:请求被重定向

4xx:浏览器端错误

5xx:服务器端错误
典型:

500 服务器内部错误

404 请求的页面没有找到

403 没有权限

200 请求成功

响应头

Content-Type: text/html 内容类型,告知浏览器接下来发送的响应主体数据是什么格式
Content-Length: 响应主体数据的长度
Date:当前的时间
Server:服务器名称
Set-Cookie:设置与页面关联的Cookie

响应体

①响应头之后紧跟着一个空行,然后接响应体。
②响应体就是Web服务器发送到客户端的实际内容。
注意:每行,包括相应行和响应头,都需要一个 \r\n结尾(需要换行)

https

简介:
http协议是明文传输的,因此很容易被截取和解析,泄漏个人数据。
https协议是在http和tcp之间多添加了一层,进行身份验证和数据加密。

密码学基础

明文: 明文指的是未被加密过的原始数据。
密文:明文被某种加密算法加密之后,会变成密文,从而确保原始数据的安全。密文也可以被解密,得到原始的明文。
密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥非对称密钥,分别应用在对称加密非对称加密上

对称加密:

对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密

常见的对称加密算法有DES、RC5。

加密过程如下:明文 + 加密算法 + 私钥 ===> 密文
解密过程如下: 密文 + 解密算法 + 私钥 ===> 明文

对称加密中用到的密钥叫做私钥,私钥表示个人私有的密钥,即该密钥不能被泄露
其加密过程中的私钥与解密过程中用到的私钥是同一个密钥,这也是称加密之所以称之为“对称”的原因。由于对称加密的算法是公开的,所以一旦私钥被泄露,那么密文就很容易被破解,所以对称加密的缺点是密钥安全管理困难

非对称加密

非对称加密也叫做公钥加密。非对称加密与对称加密相比,其安全性更好。对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现。 私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。用公钥或私钥中的任何一个进行加密,用另一个进行解密。

被公钥加密过的密文只能被私钥解密,过程如下
明文 + 加密算法 + 公钥 => 密文, 密文 + 解密算法 + 私钥 => 明文
被私钥加密过的密文只能被公钥解密,过程如下:
明文 + 加密算法 + 私钥 => 密文, 密文 + 解密算法 + 公钥 => 明文

由于加密和解密使用了两个不同的密钥,这就是非对称加密“非对称”的原因。

非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

在非对称加密中使用的主要算法有:RSA等(调库完成)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 `java.net.HttpURLConnection` 类发送 HTTP 请求并获取响应。可以通过以下步骤来实现通过用户名和密码获取 HTTP 请求的 Cookie: 1. 创建一个 `java.net.URL` 对象来表示要发送请求的 URL。 2. 打开一个 `java.net.HttpURLConnection` 对象并设置请求方法为 POST。 3. 设置请求头信息,包括 Content-Type 和 User-Agent。 4. 构造请求参数,并将其写入请求体中。 5. 发送请求并获取响应状态码。 6. 读取响应体中的 Cookie 信息,并将其保存。 以下是一个示例代码,其中 `username` 和 `password` 分别表示要发送的用户名和密码: ```java import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; public class HttpCookieExample { public static void main(String[] args) throws Exception { String username = "your_username"; String password = "your_password"; String url = "http://example.com/login"; // Step 1: Create URL object URL obj = new URL(url); // Step 2: Open connection HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("POST"); // Step 3: Set request headers con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); con.setRequestProperty("User-Agent", "Mozilla/5.0"); // Step 4: Set request parameters String urlParameters = "username=" + URLEncoder.encode(username, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8"); // Write request body con.setDoOutput(true); DataOutputStream wr = new DataOutputStream(con.getOutputStream()); wr.writeBytes(urlParameters); wr.flush(); wr.close(); // Step 5: Get response status code int responseCode = con.getResponseCode(); // Step 6: Read response body and get cookies BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); String cookie = null; while ((inputLine = in.readLine()) != null) { response.append(inputLine); if(inputLine.contains("Set-Cookie")) { cookie = inputLine.split(";")[0].split("=")[1]; } } in.close(); // Print response and cookie System.out.println("Response Code : " + responseCode); System.out.println("Response Body : " + response.toString()); System.out.println("Cookie : " + cookie); } } ``` 以上示例代码中,我们使用了 `java.net.URLEncoder` 类将用户名和密码进行 URL 编码,以便与请求一起发送。在发送请求时,我们需要将请求参数写入请求体中,可以通过 `java.io.DataOutputStream` 类实现。在读取响应体时,我们可以通过 `java.io.BufferedReader` 类逐行读取响应体,并从中提取 Cookie 信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值