ajax的請求,非同步,同源策略的學習

来源:https://www.cnblogs.com/ivanlee717/archive/2022/11/02/16849676.html
-Advertisement-
Play Games

Ajax Ajax 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML),是指⼀種創建互動式⽹⻚應⽤的⽹⻚開發技術。 Ajax 是⼀種⽤於創建快速動態⽹⻚的技術。 Ajax 是⼀種在⽆需重新載入整個⽹⻚的情況下,能夠更新部分⽹⻚的技術。 通過 ...


Ajax

Ajax 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML),是指⼀種創建互動式⽹⻚應⽤的⽹⻚開發技術。

Ajax 是⼀種⽤於創建快速動態⽹⻚的技術。

Ajax 是⼀種在⽆需重新載入整個⽹⻚的情況下,能夠更新部分⽹⻚的技術。

通過在後臺與伺服器進⾏少量數據交換,Ajax 可以使⽹⻚實現非同步更新。這意味著可以在不重新載入整個⽹⻚的情況下,對⽹⻚的某部分進⾏更新。

傳統的⽹⻚(不使⽤ Ajax)如果需要更新內容,必須重載整個⽹⻚⻚⾯。

Ajax的優點:

非同步:發送⼀個請求,不需要等待響應返回,隨時可以再發送下⼀個請求,即不需要等待。

局部刷新:通過在後臺與伺服器進行少量數據交換,Ajax 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。【傳統的網頁(不使用 Ajax)如果需要更新內容,必須重載整個網頁頁面。】

應用場景:

image-20221027114444300這是一個cnblog賬戶註冊界面,當我們在填寫昵稱的時候輸入regina,這個過程本身並沒有進行表單提交或者向伺服器發送請求,但是當游標離開這個input框之後,就會自動檢測了這裡面的內容,並且返回提示這個昵稱被占用了,而在圖二到圖三的過程當中,前端顯示為下圖,有一個刷新的過程,這個就是由於Ajax的局部刷新作用

image-20221027114424672

這個過程中到底瀏覽器做了些什麼工作

image-20221027130522590

我們篩選出XHR(XmlHttpResponse)類型的報文,看到其實瀏覽器是進行了一個checkDisplayName的操作發送給了伺服器,然後伺服器的返回如下

image-20221027130705026

image-20221027131118350

json回顧

映射關係

Python Json
dict object
list, tuple array
str string
int, float number
True True
False False
None Null
dic = {
    'user':"regina",
    'age':22,
  	'is_married':True
}
print(json.dumps(dic),type(json.dumps(dic)))

{"user": "regina", "age": 22, "is_married": true} <class 'str'>

可以看到字典中的單引號全部變成了雙引號,True映射成了true

dic = [{'user':"regina"},{'age':20}]
print(repr(json.dumps(dic)))
dic = ({'user':"regina"},{'age':20})
print(repr(json.dumps(dic)))

'[{"user": "regina"}, {"age": 20}]'
'[{"user": "regina"}, {"age": 20}]'

列表和元組全變為了數組形式。

Ajax請求

image-20221031163348141

首先確定一個概念就是Ajax請求不是表單提交,是JS代碼提交的,說明是要構建一個js代碼函數進行提交請求,所以這裡的submit是沒有用的,現在構建一段js代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
    <title>Title</title>
</head>
<body>
<h3>註冊界面</h3>
用戶名<input type="text" class="user"><br>
密碼&nbsp;&nbsp;&nbsp;&nbsp;<input type="password"><br>
<input type="submit">

<script>
    $(".user").blur(function () {
        alert(123);
    })
</script>
</body>
</html>

首先做一個測試,當游標移除用戶名時,會彈窗。

image-20221031164212951

現在改為ajax請求的方式

<script>
    $(".user").blur(function () {
        $.ajax({
            url:"http://127.0.0.1:8001/user/check/",
            //請求方式預設get
        })
    })
</script>

然後我們設置好路由,在用戶名中輸入內容並離開框,看是否有新的請求發出。

image-20221031165343058

我們的目的是要將input標簽里的用戶名傳給後端

$(".user").blur(function () {
        $.ajax({
            url:"http://127.0.0.1:8001/user/check/",
            //請求方式預設get
            data:{
                "name" : $(".user").val()
            },
        })
    })

image-20221031170310550

經過測試,我們的數據已經傳回給了後端,並且也可以列印出來,現在要做的就是進行一個驗證再反饋到前端

def check(request):
    ret = User.objects.filter(username=request.GET.get("name"))
    if ret:
        return HttpResponse("用戶已存在")
    else:
        return HttpResponse("")

image-20221031170719397

image-20221031170736348

這樣的話請求我們就做好了

$.ajax({
            url:"http://127.0.0.1:8001/user/check/",
            //請求方式預設get
            data:{
                "name" : $(".user").val()
            },
            //當相響應正常時觸發當函數
            success:function (res) {
                console.log(res)
            }           
        })

image-20221031171045159

success參數得到了後端響應回來的數據,並列印了出來,現在可以通過dom對象的操作,將返回內容添加到登陸界面進行提示。在用戶名標簽的後面添加一個span標簽,然後選中標簽進行添加內容

$(".err").html(res)

image-20221031171612764

image-20221031171653871

響應json數據

    if ret:
        res["exist"] = True
        res["msg"] = "該用戶已存在"

    return HttpResponse(json.dumps(res))

為什麼要用序列化,首先json可以發送很多的介面數據,並且如果要自己一個一個參數傳會很麻煩。按照正常邏輯,上圖代碼中我們首先寫好了json.dumps 將序列化轉為字元串,並且在html文件中進行反序列化,

success:function (res) {
  console.log(res);
  data = JSON.parse(res);
  console.log(res);
  if(data.exist){
    $(".err").html(data.msg);
  }
  else{
    $(".err").html(" ");
  }

image-20221031203024224這樣我們也可以拿到序列化中的值,但是ajax好的一點就是當我們用JsonResponse(res),在html中我們可以直接調用參數,不需要再進行parse反序列化。

image-20221031203409233

練習實例

用ajax實現一個加法

<input type="text" class="add n1"> + <input type="text" class="add n2"> = <input type="text" class="add ans" > <button class="btn">計算</button>

$(".btn").click(function () {
        $.ajax({
            url:"http://127.0.0.1:8001/user/add/",
            type:"post",
            data:{
                "num1":$(".n1").val(),
                "num2":$(".n2").val(),
            },
            success: function(res){
                $(".ans").val(res);
            }
        })
    })
def add(request):
    num1 = int(request.POST.get("num1"))
    num2 = int(request.POST.get("num2"))
    return HttpResponse(str(num1+num2))

image-20221031205211605

非同步

同步請求指的是當我訪問url時,如果在視圖函數當中添加一個睡眠,讓伺服器等待了5秒,

def reg(request):
    time.sleep(5)
    return render(request,"reg.html")

image-20221031210232136

那麼相應的,客戶端如圖所示,也需要等5秒才能進入頁面。

但是非同步指的是當我在ajax請求的視圖函數當中添加一個睡眠,但其他的請求函數不做任何改變的話,那麼這個睡眠等待只會影響這一個ajax請求,其他的正常工作。

def check(request):
    ret = User.objects.filter(username=request.GET.get("name"))
    res = {"exist":False, "msg":""}
    time.sleep(5)
    if ret:
        res["exist"] = True
        res["msg"] = "該用戶已存在"

    return JsonResponse(res)

def add(request):
    num1 = int(request.POST.get("num1"))
    num2 = int(request.POST.get("num2"))
    return HttpResponse(str(num1+num2))

image-20221031210539763

同源策略

image-20221101235237131

之前我們一直輸入的是ip地址和埠號以及路由,但是現在直接本地文件的形式打開網頁,並且我們代碼的路由依然是伺服器地址,但是依然會報錯。

image-20221101235353713

但問題就是他這個路由請求沒有問題,我們可以在後端把1和2都列印出來,但是無法進行響應。

image-20221101235440265

image-20221101235548220

這是因為瀏覽器的同源策略導致的

同源策略概念

是一種約定,是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能都會被影響。可以說web是構建在同源策略之上的,瀏覽器只是針對同源策略的一種實現。

同源策略(same origin policy)是netScape(網景)提出的一個安全策略,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊。具體表現為瀏覽器在執行腳本前,會判斷腳本是否與打開的網頁是同源的,判斷協議、功能變數名稱、埠是否都相同,相同則表示同源。其中一項不相同就表示跨域訪問。會在控制台報一個CORS異常,目的是為了保護本地數據不被JavaScript代碼獲取回來的數據污染,因此攔截的是客戶端發出的請求回來的數據接收,即請求發送了,伺服器響應了,但是無法被瀏覽器接收。

image-20221102000002541

解決方案:跨域資源共用(CORS)

服務端設置,可以允許其他源訪問服務端資源,藉助nodejs實現。

res = HttpResponse(str(num1+num2))
res["Access-Control-Allow-Origin"] = "*"
return res

image-20221102000718600

headers里會有我們添加的那句話,識別到這句話就不會攔截了。

Cors有兩種請求,一種是簡單請求,一種是非簡單請求,只要滿足以下兩種要求之一就是簡單請求

(一)請求方法是下列三個之一:

  • GET

  • POST

  • HEAD

(二) HTTP的頭部信息不超過以下幾種欄位:

  • Accept
  • Accept-language
  • Content-language
  • Last-Event-ID
  • Content-Type:只限於三個值【application/x-www-form-urlencoded、multipart/form-data、text/plain】

本文來自博客園,作者:ivanlee717,轉載請註明原文鏈接:https://www.cnblogs.com/ivanlee717/p/16849676.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這幾天 程式員優雅哥 搭建了一個組件庫的基礎腳手架: vue3-component-library-archetype 在這個腳手架的基礎上,大家可以使用內置的 cli 快速創建新組件,按照套路開發組件及文檔即可。腳手架很大程度上簡化了環境的搭建、打包的配置、類型定義的抽取等工具,開箱即用,大... ...
  • 這部分內容是最近重新複習移動端,做頁面時的筆記,這是發佈的第一篇關於rem佈局實現。內容大致分為頁面實現過程中的重新複習到的不確信內容和未掌握內容,和在頁面實現中出現的問題和解決。 技術選型 方案:採用單頁面設計 技術:rem,媒體查詢,less 設計圖:750px 內容整理: *創建common. ...
  • 1.問題背景 項目在引用自研組件庫後,啟動後webpack報錯熱更新存在問題,無法正常啟動 2.解決方案 在詢問組件庫開發同事,被告知無問題;百度無果;查找webpack源碼後,發現能定位到報錯的代碼位置,卻無力解決時。我決定使用控制變數法,禁用熱更新插件,來解決問題。幸運的是,還真就解決了,註釋掉 ...
  • 一、前言:我全都要 面對當今前端界兩座大山一樣的主流框架,React和Vue,相信很多小伙伴都或多或少都產生過這樣疑問,而這樣的問題也往往很讓人頭疼和猶豫不決: 業務場景中是不是團隊用什麼我就用什麼? 如果選擇了其中一個使用,那為什麼不用另一個? 這兩個框架各有什麼優點和無法解決的問題? 最新版本的 ...
  • 本文主要記錄在使用 Vue 腳手架時,如何使用代理解決跨越問題,以及如何進行 Ajax 請求與後端伺服器進行數據交互。 ...
  • 前言 作為前端開發者,沒有購買雲伺服器的習慣,在只需要使用資料庫的情況下,開發微信小程式完全可以用現在免費的雲後臺。 常用的有微信自帶雲開發、leancloud,我常用的是leancloud,但接下來也想試試其他的好不好用、貴不貴。因此做了對比如下。僅涵蓋國內使用計價方案,Bmob沒有寄,只是換功能變數名稱 ...
  • 您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~ 除了四種常見的同步器(發令槍、搖號器、柵欄和交換機),JUC還有所謂線程安全的容器、阻塞隊列和一些特殊的類。其中常出現的就是線程安全的容器和阻塞隊列。與其說這是兩個大的分類,還不如說它就是兩個用得最多的類:ConcurrentHashMap和A ...
  • 簡介 裝飾器模式又叫做裝飾者模式,屬於結構型的設計模式。 指的是在不改變原類文件和使用繼承的情況下動態擴展這個對象的功能,從而修飾源數據。 組成: 抽象構件(Component)角色:定義一個抽象介面以規範準備接收附加責任的對象。 具體構件(ConcreteComponent)角色:實現抽象構件,通 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...