作者
:學Java的冬瓜博客主頁
:?冬瓜的主頁??專欄
:【JavaEE】分享
: 在滿園彌漫的沉靜的光芒之前,一個人更容易看到時間,并看到自己的身影?!疯F生《我與地壇》主要內(nèi)容
:構造http請求,不需要寫代碼直接發(fā)送http請求:地址欄輸入地址,html中 img標簽,script標簽,link標簽,a標簽;需要寫代碼實現(xiàn)http請求:使用form表單,使用jquery封裝后的ajax,通過java socket構造http請求,使用第三方工具postman。http加密變成https,tls加密的流程,對稱加密,非對稱加密,證書,TLS握手過程。
一、構造HTTP請求
不需要寫代碼直接發(fā)送http請求的方法:
1> 在瀏覽器地址欄輸入url,回車
2> 在html中的標簽 link script img a等
下面是需要寫代碼來完成http請求的方式:
1、form表單
<!-- 構造GET或POST請求 -->
<form action="http://abcdef.com/myPath" method="GET"> <!--或者post-->
<input type="text" name="userId">
<input type="text" name="classId">
<input type="submit" value="提交">
</form>
2、使用jQuery封裝ajax后提供的api
ajax的全稱是
Asynchronous JavaScript and XML
,實現(xiàn)異步處理,synchronous是同步。
同步請求時,瀏覽器需要等待收到響應才能繼續(xù)執(zhí)行下面的內(nèi)容,而異步在發(fā)送請求后可以直接往下執(zhí)行,等響應來了,再通過觸發(fā)代碼執(zhí)行特定的代碼。
實現(xiàn)異步一般需要多線程/IO多路復用。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 先引入jquery -->
<script src="./blog/js/jquery.min.js"></script>
<script>
// jquery中$是一個全局對象,jQuery中的api都是以$的方式引出的,只有一個參數(shù),是一個js對象,就是{}表示的鍵值對
$.ajax(
{
type: 'get',
url: 'http://www.baidu.com/?studentName=lihua&password=123',
// 此處success聲明了一個回調(diào)函數(shù),當服務器響應給瀏覽器時,就會執(zhí)行這個回調(diào)函數(shù),同時正是這個回調(diào)實現(xiàn)了異步
success: function(data){
console.log("瀏覽器收到服務器的響應, 調(diào)用success函數(shù)");
}
}
);
console.log("發(fā)送請求后,瀏覽器立即執(zhí)行后續(xù)代碼");
</script>
</body>
</html>
- 從上圖中發(fā)現(xiàn),是先執(zhí)行回調(diào)函數(shù)下面的代碼,瀏覽器收到服務器發(fā)送的響應后,才觸發(fā)執(zhí)行的success方法。體現(xiàn)了異步的處理方式。
- 與form表單相比,ajax功能更強
1> 支持put,delete等方法
2> ajax發(fā)送的請求可以根據(jù)需求,靈活設置 header
3> ajax 發(fā)送的請求的 body也是可以靈活設置的。
3、通過 Java socket 構造 HTTP 請求
所謂的 “發(fā)送 HTTP 請求”, 本質(zhì)上就是按照 HTTP 的格式往 TCP Socket 中寫入一個字符串.
所謂的 “接受 HTTP 響應”, 本質(zhì)上就是從 TCP Socket 中讀取一個字符串, 再按照 HTTP 的格式來解析.
我們基于 Socket 的知識, 完全可以構造出一個簡單的 HTTP 客戶端程序, 用來發(fā)送各種類型的 HTTP 請求.
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class HttpClient {
private Socket socket;
private String ip;
private int port;
public HttpClient(String ip, int port) throws IOException {
this.ip = ip;
this.port = port;
socket = new Socket(ip, port);
}
public String get(String url) throws IOException {
StringBuilder request = new StringBuilder();
// 構造首行
request.append("GET " + url + " HTTP/1.1\n");
// 構造 header
request.append("Host: " + ip + ":" + port + "\n");
// 構造 空行
request.append("\n");
// 發(fā)送數(shù)據(jù)
OutputStream outputStream = socket.getOutputStream();
outputStream.write(request.toString().getBytes());
// 讀取響應數(shù)據(jù)
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024 * 1024];
int n = inputStream.read(buffer);
return new String(buffer, 0, n, "utf-8");
}
public String post(String url, String body) throws IOException {
StringBuilder request = new StringBuilder();
// 構造首行
request.append("POST " + url + " HTTP/1.1\n");
// 構造 header
request.append("Host: " + ip + ":" + port + "\n");
request.append("Content-Length: " + body.getBytes().length + "\n");
request.append("Content-Type: text/plain\n");
// 構造 空行
request.append("\n");
// 構造 body
request.append(body);
// 發(fā)送數(shù)據(jù)
OutputStream outputStream = socket.getOutputStream();
outputStream.write(request.toString().getBytes());
// 讀取響應數(shù)據(jù)
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024 * 1024];
int n = inputStream.read(buffer);
return new String(buffer, 0, n, "utf-8");
}
public static void main(String[] args) throws IOException {
HttpClient httpClient = new HttpClient("www.baidu.com", 80);
String resp = httpClient.get("/index.html");
System.out.println(resp);
//HttpClient httpClient = new HttpClient("42.192.83.143", 8080);
//String getResp = httpClient.get("/AjaxMockServer/info");
//System.out.println(getResp);
//String postResp = httpClient.post("/AjaxMockServer/info", "this is
body");
//System.out.println(postResp);
}
}
代碼運行結(jié)果(VSCode):
4、第三方工具:postman
1> 下載,安裝,注冊登錄,創(chuàng)建個人工作空間后,點下圖+號創(chuàng)建一個標簽頁,用于構造請求
2> 自定義構造請求,可以修改各種屬性
二、HTTPS
1、HTTP和HTTPS的區(qū)別
HTTPS在HTTP的基礎上,做了這幾個改造:
1> 默認端口http是80,HTTPS是443;
2> HTTPS使用SSL/TLS加密,實現(xiàn)數(shù)據(jù)傳輸?shù)陌踩?;
3> 使用數(shù)字證書驗證,來驗證網(wǎng)站的身份,確保用戶訪問的是真實的網(wǎng)站。
以前只使用http時,網(wǎng)費不足的時候就會在瀏覽網(wǎng)頁收到互聯(lián)網(wǎng)服務提供商(isp)的彈窗提示,現(xiàn)在HTTPS流行后,網(wǎng)費不足就沒有提示了,而是直接斷網(wǎng)。因為HTTPS對網(wǎng)絡傳輸提供了加密,運營商設備無法再對瀏覽器端發(fā)送到服務器端的數(shù)據(jù)進行解析,也就無法提醒了,從而也解決了運營商劫持的問題。下面我們來看看SSL/TLS給HTTP加密的過程:
2、SSL/TLS加密流程
SSL是TLS的前身,它們都是加密安全協(xié)議,現(xiàn)在絕大部分瀏覽器都不支持SSL,而是支持TLS。
2.1、對稱加密
舉個例子:
- 在上述場景中,同一個密鑰,既可以用來加密,又可以用來解密,雙方之間都只通過這個密鑰進行加密解密,這樣的方式叫做對稱加密。
- 但是,對稱加密的密鑰如果被第三方知道,就很容易破解了。那么就引入了我們的對稱加密,從而把密鑰安全傳輸。
2.2、非對稱加密
1> 非對稱加密理解:
- 對稱加密中引入了公鑰和私鑰。如果數(shù)據(jù)用公鑰加密,就只能用私鑰解密;如果數(shù)據(jù)用私鑰加密,就只能用公鑰解密。
- 應用到客戶端和服務端時,服務器擁有成對的公鑰和私鑰,公布自己的公鑰讓客戶端知道,而私鑰只有服務器端自己知道。
客戶端使用服務器公布的公鑰進行數(shù)據(jù)加密 傳輸數(shù)據(jù)給服務端,服務端使用只有自己知道的私鑰解密。這樣的非對稱加密也叫公鑰加密。 - 引入非對稱加密后,客戶端可以用服務器端給的公鑰對 數(shù)據(jù)傳輸?shù)姆绞?比如使用倒念) 進行加密,這個數(shù)據(jù)只有服務器端的 私鑰才能解密,解密后就可以進行對稱加密(后續(xù)進行對稱加密是為了傳輸效率)。就達到了 安全傳輸 對稱密鑰 的目的,不再是對稱加密中,唯一的密鑰被第三方知道的情況。
2> 通過非對稱加密(公鑰加密,私鑰解密)的方式,可以讓 對稱密鑰 安全的發(fā)送到服務端,但是還存在一種問題,第三方雖然不知道服務端的私鑰,但是是否依舊可以獲取數(shù)據(jù)呢?答案是可以的,請看下圖:
在上圖中,黑客就作為中間的聯(lián)系人,進行"兩頭騙"的操作,怎么解決這個問題?加證書!
2.3、證書
客戶端如何認證證書是否被修改?
- 認證機構也有一組公鑰和私鑰,私鑰用來加密hash值得到簽名,公鑰是公布給客戶端的。
- 當客戶端向服務器申請公鑰時,服務器會把證書一并發(fā)給客戶端??蛻舳丝梢允褂谜J證機構提供的公鑰對證書的簽名進行解密,這里使用一種hash算法得到hash1,然后自己用同樣的hash算法對其它字段進行計算得到hash2,如果hash1和hash2一樣就代表證書未被修改過。
- 引入證書后,首先黑客不知道認證機構的私鑰,無法對服務端證書的簽名進行解密,也就無法篡改證書;其次,黑客只要一修改證書上對應的頒發(fā)機構或服務器公鑰,客戶端這里計算得到的hash1和hash2就不再相同。
- 所以,引入證書后,就保證了黑客無法在中間使用自己的公鑰和私鑰進行"兩頭騙"的行為。但是如果黑客把證書也一并替換了呢?
黑客通過欺騙 證書頒發(fā)機構(CA)或者攻擊 CA的系統(tǒng)來獲得有效證書,這種情況叫做 “CA欺騙攻擊”,但是由于證書頒發(fā)機構有嚴格的審核程序和安全措施,黑客獲取證書頒發(fā)機構的有效證書的概率很小,并且瀏覽器和操作系統(tǒng)也會定期更新黑名單,將已經(jīng)被證實為不安全的證書加入其中,以保護用戶受此類攻擊。
黑客無法獲取到證書,自然就無法使用自己的證書進行替換了!
2.4、TLS握手過程
TCP三次握手后,客戶端與服務器建立連接,以確保雙方的通信是可靠的。在TCP連接建立之后,客戶端和服務器進行TLS握手以建立安全通信。下面是TLS握手的過程:文章來源:http://www.zghlxwxcb.cn/news/detail-433489.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-433489.html
到了這里,關于【Java EE】-HTTP請求構造以及HTTPS的加密流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!