国产精品成人免费视频_91丝袜美腿美女视频网站_国产一区二区三区在线看_亚洲欧美另类中文字幕_在线电影av不卡网址_国产视频丨精品|在线观看_日韩一区二区三区国产_国产欧美va欧美va香蕉在线_热re91久久精品国99热蜜臀_亚洲第一精品电影_久久九九亚洲综合_国产成人综合精品_97视频在线观看网址_精品视频久久久久久_日韩av片免费在线观看_久久精品国产99国产精品澳门

聚集網(jujiwang.com) - 收錄免費分類目錄信息軟文發布網址提交
免費加入

利用 location.href 簡化 Web 應用程序的調試 (利用localstorage做一個歌曲收藏)

文章編號:11167時間:2024-09-30人氣:


利用

在開發和調試 Web 應用程序時,能夠輕松地打印出當前 URL 和查詢參數非常有幫助。這有助于跟蹤應用程序的狀態并隔離問題。

在 JavaScript 中,我們可以使用 location.href 屬性來獲取當前 URL。


// 獲取當前 URL
const url = location.href;// 輸出當前 URL
console.log(`當前 URL:${url}`);

我們可以使用 location.search 屬性來獲取查詢參數。


// 獲取查詢參數
const searchParams = location.search;// 輸出查詢參數
console.log(`查詢參數:${searchParams}`);

利用這些特性,我們可以在 Web 應用程序中創建簡單的調試工具。

利用 localStorage 做一個歌曲收藏

下面,我們利用 location.href localStorage 來創建一個簡單的歌曲收藏應用。


// 創建一個歌曲收藏
const songs = [];// 將歌曲添加到收藏
function addSong(song) {songs.push(song);localStorage.setItem('songs', JSON.stringify(songs));
}// 從收藏中刪除歌曲
function removeSong(song) {const index = songs.indexOf(song);if (index > -1) {songs.splice(index, 1);localStorage.setItem('songs', JSON.stringify(songs));}
}// 獲取歌曲收藏
function getSongs() {const storedSongs = localStorage.getItem('songs');if (storedSongs) {return JSON.parse(storedSongs);} else {return [];}
}// 打印當前 URL 和歌曲收藏
function debug() {console.log(`當前 URL:${location.href}`);console.log(`歌曲收藏:${JSON.stringify(getSongs())}`);
}

我們可以通過以下方式使用這個應用:

1. 添加歌曲到收藏:調用 addSong 函數。 2. 從收藏中刪除歌曲:調用 removeSong 函數。 3. 獲取歌曲收藏:調用 getSongs 函數。 4. 調試:調用 debug 函數以輸出當前 URL 和歌曲收藏。

通過使用 location.href localStorage ,我們創建了一個簡單的工具,可以幫助我們調試應用程序并跟蹤其狀態。


web前端開發需要用到哪些知識

應該熟練掌握的基礎技能:

java web應用如何實現單點登錄

在 B/S 系統中,登錄功能通常都是基于 Cookie 來實現的。 當用戶登錄成功后,一般會將登錄狀態記錄到 Session 中,或者是給用戶簽發一個 Token,無論哪一種方式,都需要在客戶端保存一些信息(Session ID 或 Token ),并要求客戶端在之后的每次請求中攜帶它們。 在這樣的場景下,使用 Cookie 無疑是最方便的,因此我們一般都會將 Session 的 ID 或 Token 保存到 Cookie 中,當服務端收到請求后,通過驗證 Cookie 中的信息來判斷用戶是否登錄 。

單點登錄(Single Sign On, SSO)是指在同一帳號平臺下的多個應用系統中,用戶只需登錄一次,即可訪問所有相互信任的應用系統。 舉例來說,網絡貼吧和網絡地圖是網絡公司旗下的兩個不同的應用系統,如果用戶在網絡貼吧登錄過之后,當他訪問網絡地圖時無需再次登錄,那么就說明網絡貼吧和網絡地圖之間實現了單點登錄。

單點登錄的本質就是在多個應用系統中共享登錄狀態。 如果用戶的登錄狀態是記錄在 Session 中的,要實現共享登錄狀態,就要先共享 Session,比如可以將 Session 序列化到 Redis 中,讓多個應用系統共享同一個 Redis,直接讀取 Redis 來獲取 Session。

當然僅此是不夠的,因為不同的應用系統有著不同的域名,盡管 Session 共享了,但是由于 Session ID 是往往保存在瀏覽器 Cookie 中的,因此存在作用域的限制,無法跨域名傳遞,也就是說當用戶在 中登錄后,Session ID 僅在瀏覽器訪問 時才會自動在請求頭中攜帶,而當瀏覽器訪問 時,Session ID 是不會被帶過去的。 實現單點登錄的關鍵在于,如何讓 Session ID(或 Token)在多個域中共享。

實現方式一:父域 Cookie

在將具體實現之前,我們先來聊一聊 Cookie 的作用域。

Cookie 的作用域由 domain 屬性和 path 屬性共同決定。 domain 屬性的有效值為當前域或其父域的域名/IP地址,在 Tomcat 中,domain 屬性默認為當前域的域名/IP地址。 path 屬性的有效值是以“/”開頭的路徑,在 Tomcat 中,path 屬性默認為當前 Web 應用的上下文路徑。

如果將 Cookie 的 domain 屬性設置為當前域的父域,那么就認為它是父域 Cookie。 Cookie 有一個特點,即父域中的 Cookie 被子域所共享,換言之,子域會自動繼承父域中的Cookie。

利用 Cookie 的這個特點,不難想到,將 Session ID(或 Token)保存到父域中不就行了。 沒錯,我們只需要將 Cookie 的 domain 屬性設置為父域的域名(主域名),同時將 Cookie 的 path 屬性設置為根路徑,這樣所有的子域應用就都可以訪問到這個 Cookie 了。 不過這要求應用系統的域名需建立在一個共同的主域名之下,如 和 ,它們都建立在 這個主域名之下,那么它們就可以通過這種方式來實現單點登錄。

總結:此種實現方式比較簡單,但不支持跨主域名。

實現方式二:認證中心

我們可以部署一個認證中心,認證中心就是一個專門負責處理登錄請求的獨立的 Web 服務。

用戶統一在認證中心進行登錄,登錄成功后,認證中心記錄用戶的登錄狀態,并將 Token 寫入 Cookie。 (注意這個 Cookie 是認證中心的,應用系統是訪問不到的。 )

應用系統檢查當前請求有沒有 Token,如果沒有,說明用戶在當前系統中尚未登錄,那么就將頁面跳轉至認證中心。 由于這個操作會將認證中心的 Cookie 自動帶過去,因此,認證中心能夠根據 Cookie 知道用戶是否已經登錄過了。 如果認證中心發現用戶尚未登錄,則返回登錄頁面,等待用戶登錄,如果發現用戶已經登錄過了,就不會讓用戶再次登錄了,而是會跳轉回目標 URL ,并在跳轉前生成一個 Token,拼接在目標 URL 的后面,回傳給目標應用系統。

應用系統拿到 Token 之后,還需要向認證中心確認下 Token 的合法性,防止用戶偽造。 確認無誤后,應用系統記錄用戶的登錄狀態,并將 Token 寫入 Cookie,然后給本次訪問放行。 (注意這個 Cookie 是當前應用系統的,其他應用系統是訪問不到的。 )當用戶再次訪問當前應用系統時,就會自動帶上這個 Token,應用系統驗證 Token 發現用戶已登錄,于是就不會有認證中心什么事了。

這里順便介紹兩款認證中心的開源實現:

Apereo CAS 是一個企業級單點登錄系統,其中 CAS 的意思是”Central Authentication Service“。 它最初是耶魯大學實驗室的項目,后來轉讓給了 JASIG 組織,項目更名為 JASIG CAS,后來該組織并入了Apereo 基金會,項目也隨之更名為 Apereo CAS。

XXL-SSO 是一個簡易的單點登錄系統,由大眾點評工程師許雪里個人開發,代碼比較簡單,沒有做安全控制,因而不推薦直接應用在項目中,這里列出來僅供參考。

總結:此種實現方式相對復雜,支持跨域,擴展性好,是單點登錄的標準做法。

實現方式三:LocalStorage 跨域

前面,我們說實現單點登錄的關鍵在于,如何讓 Session ID(或 Token)在多個域中共享。

父域 Cookie 確實是一種不錯的解決方案,但是不支持跨域。那么有沒有什么奇淫技巧能夠讓 Cookie 跨域傳遞呢?

很遺憾,瀏覽器對 Cookie 的跨域限制越來越嚴格。 Chrome 瀏覽器還給 Cookie 新增了一個 SameSite 屬性,此舉幾乎禁止了一切跨域請求的 Cookie 傳遞(超鏈接除外),并且只有當使用 HTTPs 協議時,才有可能被允許在 AJAX 跨域請求中接受服務器傳來的 Cookie。

不過,在前后端分離的情況下,完全可以不使用 Cookie,我們可以選擇將 Session ID (或 Token )保存到瀏覽器的 LocalStorage 中,讓前端在每次向后端發送請求時,主動將 LocalStorage 的數據傳遞給服務端。 這些都是由前端來控制的,后端需要做的僅僅是在用戶登錄成功后,將 Session ID (或 Token )放在響應體中傳遞給前端。

在這樣的場景下,單點登錄完全可以在前端實現。 前端拿到 Session ID (或 Token )后,除了將它寫入自己的 LocalStorage 中之外,還可以通過特殊手段將它寫入多個其他域下的 LocalStorage 中。

原文鏈接:前端通過 iframe+postMessage() 方式,將同一份 Token 寫入到了多個域下的 LocalStorage 中,前端每次在向后端發送請求之前,都會主動從 LocalStorage 中讀取 Token 并在請求中攜帶,這樣就實現了同一份 Token 被多個域所共享。

總結:此種實現方式完全由前端控制,幾乎不需要后端參與,同樣支持跨域。

補充:域名分級

從專業的角度來說(根據《計算機網絡》中的定義),、 為一級域名(也稱頂級域名),、 為二級域名,、 為三級域名,以此類推,N 級域名就是 N-1 級域名的直接子域名。

從使用者的角度來說,一般把可支持獨立備案的主域名稱作一級域名,如 、 皆可稱作一級域名,在主域名下建立的直接子域名稱作二級域名,如 為二級域名。

axios如何利用promise無痛刷新token的實現方法

需求最近遇到個需求:前端登錄后,后端返回token和token有效時間,當token過期時要求用舊token去獲取新的token,前端需要做到無痛刷新token,即請求刷新token時要做到用戶無感知。 需求解析當用戶發起一個請求時,判斷token是否已過期,若已過期則先調refreshToken接口,拿到新的token后再繼續執行之前的請求。 這個問題的難點在于:當同時發起多個請求,而刷新token的接口還沒返回,此時其他請求該如何處理?接下來會循序漸進地分享一下整個過程。 實現思路由于后端返回了token的有效時間,可以有兩種方法:方法一:在請求發起前攔截每個請求,判斷token的有效時間是否已經過期,若已過期,則將請求掛起,先刷新token后再繼續請求。 方法二:不在請求前攔截,而是攔截返回后的數據。 先發起請求,接口返回過期后,先刷新token,再進行一次重試。 兩種方法對比方法一 優點: 在請求前攔截,能節省請求,省流量。 缺點: 需要后端額外提供一個token過期時間的字段;使用了本地時間判斷,若本地時間被篡改,特別是本地時間比服務器時間慢時,攔截會失敗。 PS:token有效時間建議是時間段,類似緩存的MaxAge,而不要是絕對時間。 當服務器和本地時間不一致時,絕對時間會有問題。 方法二優點:不需額外的token過期字段,不需判斷時間。 缺點: 會消耗多一次請求,耗流量。 綜上,方法一和二優缺點是互補的,方法一有校驗失敗的風險(本地時間被篡改時,當然一般沒有用戶閑的蛋疼去改本地時間的啦),方法二更簡單粗暴,等知道服務器已經過期了再重試一次,只是會耗多一個請求。 在這里博主選擇了 方法二。 實現這里會使用axios來實現,方法一是請求前攔截,所以會使用()這個方法;而方法二是請求后攔截,所以會使用()方法。 封裝axios基本骨架首先說明一下,項目中的token是存在localStorage中的。 基本骨架:import axios from axios// 從localStorage中獲取tokenfunction getLocalToken () { const token = (token) return token}// 給實例添加一個setToken方法,用于登錄后將最新token動態添加到header,同時將token保存在localStorage中 = (token) => { [X-Token] = token (token, token)}// 創建一個axios實例const instance = ({ baseURL: /api, timeout: , headers: { Content-Type: application/json, X-Token: getLocalToken() // headers塞token }})// 攔截返回的數據(response => { // 接下來會在這里進行token過期的邏輯處理 return response}, error => { return (error)})export default instance這個是項目中一般的axios實例的封裝,創建實例時,將本地已有的token放進header,然后export出去供調用。 接下來就是如何攔截返回的數據啦。 攔截實現后端接口一般會有一個約定好的數據結構,如:{code: 1234, message: token過期, data: {}}如我這里,后端約定當code === 1234時表示token過期了,此時就要求刷新token。 (response => { const { code } = if (code === 1234) { // 說明token過期了,刷新token return refreshToken()(res => { // 刷新token成功,將最新的token更新到header中,同時保存在localStorage中 const { token } = (token) // 獲取當前失敗的請求 const config = // 重置一下配置 [X-Token] = token = // url已經帶上了/api,避免出現/api/api的情況 // 重試當前請求并返回promise return instance(config) })(res => { (refreshtoken error =>, res) //刷新token失敗,神仙也救不了了,跳轉到首頁重新登錄吧 = / }) } return response}, error => { return (error)})function refreshToken () { // instance是當前中已創建的axios實例 return (/refreshtoken)(res => )}這里需要額外注意的是,就是原請求的配置,但這個是已經處理過了的,已經帶上了baseUrl,因此重試時需要去掉,同時token也是舊的,需要刷新下。 以上就基本做到了無痛刷新token,當token正常時,正常返回,當token已過期,則axios內部進行一次刷新token和重試。 對調用者來說,axios內部的刷新token是一個黑盒,是無感知的,因此需求已經做到了。 問題和優化上面的代碼還是存在一些問題的,沒有考慮到多次請求的問題,因此需要進一步優化。 如何防止多次刷新token如果refreshToken接口還沒返回,此時再有一個過期的請求進來,上面的代碼就會再一次執行refreshToken,這就會導致多次執行刷新token的接口,因此需要防止這個問題。 我們可以在中用一個flag來標記當前是否正在刷新token的狀態,如果正在刷新則不再調用刷新token的接口。 // 是否正在刷新的標記let isRefreshing = (response => { const { code } = if (code === 1234) { if (!isRefreshing) { isRefreshing = true return refreshToken()(res => { const { token } = (token) const config = [X-Token] = token = return instance(config) })(res => { (refreshtoken error =>, res) = / })(() => { isRefreshing = false }) } } return response}, error => { return (error)})這樣子就可以避免在刷新token時再進入方法了。 但是這種做法是相當于把其他失敗的接口給舍棄了,假如同時發起兩個請求,且幾乎同時返回,第一個請求肯定是進入了refreshToken后再重試,而第二個請求則被丟棄了,仍是返回失敗,所以接下來還得解決其他接口的重試問題。 同時發起兩個或以上的請求時,其他接口如何重試兩個接口幾乎同時發起和返回,第一個接口會進入刷新token后重試的流程,而第二個接口需要先存起來,然后等刷新token后再重試。 同樣,如果同時發起三個請求,此時需要緩存后兩個接口,等刷新token后再重試。 由于接口都是異步的,處理起來會有點麻煩。 當第二個過期的請求進來,token正在刷新,我們先將這個請求存到一個數組隊列中,想辦法讓這個請求處于等待中,一直等到刷新token后再逐個重試清空請求隊列。 那么如何做到讓這個請求處于等待中呢?為了解決這個問題,我們得借助Promise。 將請求存進隊列中后,同時返回一個Promise,讓這個Promise一直處于Pending狀態(即不調用resolve),此時這個請求就會一直等啊等,只要我們不執行resolve,這個請求就會一直在等待。 當刷新請求的接口返回來后,我們再調用resolve,逐個重試。 最終代碼:// 是否正在刷新的標記let isRefreshing = false// 重試隊列,每一項將是一個待執行的函數形式const requests = [](response => { const { code } = if (code === 1234) { const config = if (!isRefreshing) { isRefreshing = true return refreshToken()(res => { const { token } = (token) [X-Token] = token = // 已經刷新了token,將所有隊列中的請求進行重試 (cb => cb(token)) return instance(config) })(res => { (refreshtoken error =>, res) = / })(() => { isRefreshing = false }) } else { // 正在刷新token,返回一個未執行resolve的promise return new Promise((resolve) => { // 將resolve放進隊列,用一個函數形式來保存,等token刷新后直接執行 ((token) => { = [X-Token] = token resolve(instance(config)) }) }) } } return response}, error => { return (error)})這里可能比較難理解的是requests這個隊列中保存的是一個函數,這是為了讓resolve不執行,先存起來,等刷新token后更方便調用這個函數使得resolve執行。 至此,問題應該都解決了。 最后完整代碼import axios from axios// 從localStorage中獲取tokenfunction getLocalToken () { const token = (token) return token}// 給實例添加一個setToken方法,用于登錄后將最新token動態添加到header,同時將token保存在localStorage中 = (token) => { [X-Token] = token (token, token)}function refreshToken () { // instance是當前中已創建的axios實例 return (/refreshtoken)(res => )}// 創建一個axios實例const instance = ({ baseURL: /api, timeout: , headers: { Content-Type: application/json, X-Token: getLocalToken() // headers塞token }})// 是否正在刷新的標記let isRefreshing = false// 重試隊列,每一項將是一個待執行的函數形式const requests = [](response => { const { code } = if (code === 1234) { const config = if (!isRefreshing) { isRefreshing = true return refreshToken()(res => { const { token } = (token) [X-Token] = token = // 已經刷新了token,將所有隊列中的請求進行重試 (cb => cb(token)) return instance(config) })(res => { (refreshtoken error =>, res) = / })(() => { isRefreshing = false }) } else { // 正在刷新token,將返回一個未執行resolve的promise return new Promise((resolve) => { // 將resolve放進隊列,用一個函數形式來保存,等token刷新后直接執行 ((token) => { = [X-Token] = token resolve(instance(config)) }) }) } } return response}, error => { return (error)})export default instance

后端允許跨域怎么設置(后端配置允許跨域無效)

跨域的幾種方法

瀏覽器出于安全方面的考慮,只允許客戶端與本域(同協議、同域名、同端口,三者缺一不可)下的接口交互。 不同源的客戶端腳本在沒有明確授權的情況下,不能讀寫對方的資源,這被稱為同源策略。

而有時候,我們不得不在一個客戶端下訪問不同域中的資源,于是需要用到一些方法來避開瀏覽器的同源策略,這些方法被稱為跨域。

實現跨域有如下幾種方法:

JSONP(JSONwithPadding)是數據格式JSON的一種使用模式,可以使網頁實現跨域請求。 其原理主要利用了HTML的script標簽。 由于script是采用開放策略,通過設置src引入不同域下的資源,所以可以通過script實現跨域,該方法需要后端支持。 jsonp跨域的實現步驟如下:

下面來做個演示,首先為演示方便,將系統的hosts做如下修改:

以上例子最終實現了由到的跨域。 應注意的是,因為script只能發送GET請求,所以jsonp只能實現GET請求的跨域。 如果希望能實現其他請求的跨域,就可以用接下來介紹的一種方法——CORS。

CORS(全稱為:Cross-OriginResouceSharing)跨域資源共享,是一種通過ajax跨域請求資源的方法。 瀏覽器將CORS請求分為兩大類,簡單請求(simplerequest)和非簡單請求(not-so-simplerequest,瀏覽器對這兩種請求的處理方式不一樣。 如果請求滿足以下兩個條件,則為簡單請求。

簡單請求的實現方式即當用XMLHttpRequest發請求時,瀏覽器如果發現該請求不符合同源策略,會給該請求加上一個請求頭origin,origin用來說明本次請求來自哪個源(協議+域名+端口)。 如果origin指定的源不在后臺允許范圍內,后臺會返回一個正常的HTTP響應,然后瀏覽器會發現該響應頭部信息不包含Access-Control-Allow-Origin字段,然后拋出一個錯誤,該錯誤被XMLHttpRequest的onerror函數捕獲,響應被駁回,但因為該錯誤無法通過狀態碼識別,所以HTTP回應的狀態碼還是200。 如果origin在后臺允許范圍內,則服務器返回的響應,會包含Access-Control-Allow-Origin:Origin(指定的源)信息,瀏覽器此時不會拋錯,響應能正常處理。

非簡單請求是是請求方法為PUT或DELETE,又或者Content-Type為application/json的對服務器有特殊要求的請求。 非簡單請求的CORS請求,會在正式通信前增加一次HTTP查詢,稱為預檢(preflight),詢問服務器當前網頁所在域名是否在服務器的許可名單中,如果在,則發出正式的XMLHttpRequest,之后就與簡單請求一樣,不在則報錯。

依舊用上面的例子。

最終實現的效果與第一個jsonp的例子一樣。

還有一種方式,就是通過降域來實現跨域。 即通過設置的方式,將兩個域名的domain設置為一個,如對于和,可以通過js設置=,實現跨域。

做個演示,假設在下有一個文件,其中中有一個iframe,它的src為。

用降域方法實現跨域操作簡單,但是有一些缺點。 比如域名只能往下設置,不能回去,比如從回到。 同時如果一個子域名被攻擊,多個被降域的域名都會被連帶攻擊,有很大的安全風險。

postMessage是一個webAPI,可以實現跨域通信。 ()被調用時,會在所有頁面腳本執行完畢后,向目標窗口派發一個MessageEvent消息。 語法如下:

MessageEvent具有如下屬性:

用一個與上面降域類似的例子來做演示。 同樣有兩個頁面和,中的iframe的src指向。

最終實現與通信效果如下:

使用postMessage方法應注意的是,如果不希望從其他網站接收message,那么不要為message事件添加任何監聽器。 如果確實希望接收其他網站的message,那么應該始終使用origin和source屬性來驗證發件人的身份,以免被惡意的網站攻擊。

以上就是幾種常見的跨域方法,各有優劣,且各自都有一定的安全問題,在日常應用中,需要有針對性的使用,對可能的安全風險采取相應措施。

前后端聯調——跨域問題

前端通過http請求跨域的同時需要帶上cookie信息,前端需要設置withCredentials=true。

而后端也需要有所修改。

Access-Control-Allow-Origin字段必須指定域名,不能為*

Access-Control-Allow-Credentials為true

后端可以通過HtttpServletRequest的Header中找到Origin。 是跨域地址的host加port。

后端需要維護一個跨域URL的白名單,用Origincontains匹配白名單的URL,成功則配置response的Access-Control-Allow-Origin,指定Origin。

就實現跨域傳cookie了。

參考:

什么是跨域、怎么解決跨域?

一個請求url的**協議、端口、域名**其中任意一個與當前頁面url不相同就是跨域

即:?(http/https)協議、(segmentfault)主域名、(www)子域名、(8080)端口

是因為瀏覽器的同源策略的限制,同源策略是一種安全策略,同源指的是域名,協議,端口相同,會阻止一個域的js腳本和另一個域的內容進行交互。 防止在一個瀏覽器中的兩個頁面產生不安全、異常的行為。

當然如果不同源的話會產生一定的限制:

【1】無法讀取非同源網頁的Cookie、LocalStorage和IndexedDB

【2】無法接觸非同源網頁的DOM

【3】無法向非同源地址發送AJAX請求

(‘script’)生成一個script標簽,然后插body里而已。

JSONP的實現原理就是創建一個script標簽,再把需要請求的api地址放到src里.這個請求只能用GET方法,不可能是POST(向服務端傳送數據)。

一種非正式傳輸協議,它會允許用戶傳遞一個callback參數給服務端,然后服務端返回數據的時候會將這個callback參數作為函數名來包裹住JSON數據,然后客戶端就可以隨意的定義自己的函數來處理返回的數據了。

一般是后端在處理請求數據的時候,添加允許跨域的請求頭信息,服務端設置Access-Control-Allow-Origin就可以,如果需要攜帶cookie,前后端都需要設置

window對象有個name的屬性,在一個window下,窗口載入的頁面都是共享一個。

在中,怎么把頁面加載進來,獲取的數據。 在頁面使用iframe,可以去獲取的數據,然后在頁面中取得iframe獲取得數據。

但是iframe想要獲取中的數據,只需要給這個iframe的src設為就可以,如果想要得到iframe所獲得的數據,也就是iframe的的值,還要把這個iframe的src設成跟頁面同一個域才可以,不然訪問不到iframe里的屬性。

//父窗口打開一個子窗口

??varopenWindow=(,title);

//父窗口向子窗口發消息(第一個參數代表發送的內容,第二個參數代表接收消息窗口的url)

??(Nicetomeetyou!,);

調用message事件,監聽對方發送的消息

//監聽message消息

??(message,function(e){

??();//發送消息的窗口

??();//消息發向的網址

??();?//?發送的消息

??},false);

??#監聽9099端口

??listen9099;

??#域名是localhost

??server_namelocalhost;

??#凡是localhost:9099/api這個樣子的,都轉發到真正的服務端地址

??location^~/api{

????proxy_pass;

//請求的時候直接用回前端這邊的域名,這就不會跨域,然后Nginx監聽到凡是localhost:9099/api這個樣子的,都轉發到真正的服務端地址

?method:POST,

?headers:{

??Accept:application/json,

??Content-Type:application/json

??msg:HelloIframePost

關于跨域的問題

一、在前端開發過程中,如果準備開發富應用,跨域的問題將會隨之而來。

????????我們先看看什么是跨域呢:

????????所謂跨域,或者異源,是指主機名(域名)、協議、端口號只要有其一不同,就為不同的域(或源)。 出于保護用戶數據的目的,瀏覽器有一個最基本的策略就是同源策略,只允許頁面內的腳本訪問當前域的資源(加載腳本、資源等不受此限制)。

二、如果瀏覽器廠商不對跨域請求進行處理,會給我們帶來什么危害呢?

????有心人士(病毒制造者)會利用這個漏洞進行如下攻擊:

????/XSRF攻擊,簡單的來講就是在頁面中請求的接口(瀏覽器會自動帶上用戶在的cookie),從而獲取用戶的在的相關信息。

????注入攻擊,類似于SQL攻擊,提交含有惡意腳本的數據到服務器,從而達到破壞頁面或者獲取用戶的cookie。

三、我們了解到了什么是跨域,那我們又應該如何解決呢,現在找到了這些比較權威的文章,大家先品讀一下:

????????官方網站關于跨域的文章(CrossOrigin),HTTP訪問控制(CORS)

????????官方網站關于瀏覽器同源策略的簡要介紹(SameOrigin),?瀏覽器的同源策略

四、讀完這些文章,你打算怎么處理跨域問題呢,我先談談自己關于跨域的解決方案:

????????1.采用CORS協議,直接在Nginx中設置允許跨域的header(也可以在后端的應用程序內設置,不過在Nginx入口配置的話更加統一),在location配置中直接使用指令add_header(官方文檔鏈接),示例配置如下:

????????2.使用JSONP,也是需要后端配合,利用“瀏覽器加載腳本、資源時不受同源策略的約束”這個特性,但是這種方式非常受限制,例如只能使用GET請求,不能攜帶自定義header等。

????3.其他的一些方法,例如,以及HTML5中的特性等

五、其他參考鏈接

????1.?淺談JS跨域問題

????2.跨域資源共享CORS詳解----阮一峰

六、聲明

????現在網絡上的知識非常復雜,有些是摘自權威書籍的,有些是作者自己理解然后記錄下來的,有些是瞎掰的,所以一定要結合情況多多甄別,對于有權威文檔的知識點,建議先參考文檔。

后端配置跨域

原文連接:原文地址

跨域的詳細介紹可以參考:瀏覽器和服務器實現跨域(CORS)判定的原理,這里不多贅述。

1、主要就是客戶端向發送了服務端請求,服務器已經能返回數據,但是瀏覽器不接收

2、在接口里面加上:(因為request是處理請求,response是返回結果)

(Access-Control-Allow-Origin,?*);

(Cache-Control,no-cache);?

3、如果是使用SpringBoot創建的項目,直接添加一句注解到controller和方法就可以了:

@CrossOrigin

其中@CrossOrigin中的2個參數:

origins?:允許可訪問的域列表

maxAge:準備響應前的緩存持續的最大時間(以秒為單位)。

在這個例子中,對于retrieve()和remove()處理方法都啟用了跨域支持,還可以看到如何使用@CrossOrigin屬性定制CORS配置。 如果同時使用controller和方法級別的CORS配置,Spring將合并兩個注釋屬性以創建合并的CORS配置。

4、如果您正在使用SpringSecurity,請確保在Spring安全級別啟用CORS,并允許它利用SpringMVC級別定義的配置。

二、全局CORS配置

除了細粒度、基于注釋的配置之外,您還可能需要定義一些全局CORS配置。 這類似于使用篩選器,但可以聲明為SpringMVC并結合細粒度@CrossOrigin配置。 默認情況下,所有originsandGET,HEADandPOSTmethods是允許的。

JavaConfig

使整個應用程序的CORS簡化為:

更多使用請看原文連接和官方文檔

后端解決前端跨域請求問題

場景:前后端分離,頁面和后端項目部署在不同服務器,出現請求跨域問題。

原因:CORS:跨來源資源共享(CORS)是一份瀏覽器技術的規范,提供了Web服務從不同網域傳來沙盒腳本的方法,以避開瀏覽器的同源策略,是JSONP模式的現代版。 與JSONP不同,CORS除了GET要求方法以外也支持其他的HTTP要求。 用CORS可以讓網頁設計師用一般的XMLHttpRequest,這種方式的錯誤處理比JSONP要來的好,JSONP對于RESTful的API來說,發送POST/PUT/DELET請求將成為問題,不利于接口的統一。 但另一方面,JSONP可以在不支持CORS的老舊瀏覽器上運作。 不過現代的瀏覽器(IE10以上)基本都支持CORS。

預檢請求(option):在CORS中,可以使用OPTIONS方法發起一個預檢請求(一般都是瀏覽檢測到請求跨域時,會自動發起),以檢測實際請求是否可以被服務器所接受。 預檢請求報文中的Access-Control-Request-Method首部字段告知服務器實際請求所使用的HTTP方法;Access-Control-Request-Headers首部字段告知服務器實際請求所攜帶的自定義首部字段。 服務器基于從預檢請求獲得的信息來判斷,是否接受接下來的實際請求。

解決方案:

1、創建一個過濾器,過濾options請求。

*解決跨域問題

publicclassCorsFilterimplementsFilter{//filter接口的自定義實現

??publicvoidinit(FilterConfigfilterConfig)throwsServletException{

??publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{

HttpServletResponseresponse=(HttpServletResponse)servletResponse;

????HttpServletRequestrequest=(HttpServletRequest)servletRequest;

????(Access-Control-Allow-Origin,*);

????if((())){//這里通過判斷請求的方法,判斷此次是否是預檢請求,如果是,立即返回一個204狀態嗎,標示,允許跨域;預檢后,正式請求,這個方法參數就是我們設置的post了

??????(_NO_CONTENT);//_NO_CONTENT=204

??????(Access-Control-Allow-Methods,POST,GET,DELETE,OPTIONS,DELETE);//當判定為預檢請求后,設定允許請求的方法

??????(Access-Control-Allow-Headers,Content-Type,x-requested-with);//當判定為預檢請求后,設定允許請求的頭部類型

??????(Access-Control-Max-Age,1);?//預檢有效保持時間

(request,response);

??publicvoiddestroy(){

2、修改文件

?filter-namecors/filter-name

?/filter-class

filter-mapping

filter-namecors/filter-name

?url-pattern/*?/url-pattern

/filter-mapping

3、添加HttpRequestHandlerAdapter?http請求處理器適配器。

HttpRequestHandlerAdapter作為HTTP請求處理器適配器僅僅支持對HTTP請求處理器的適配。 它簡單的將HTTP請求對象和響應對象傳遞給HTTP請求處理器的實現,它并不需要返回值。 它主要應用在基于HTTP的遠程調用的實現上。

beanclass=/

js跳轉指定頁面(js中跳轉頁面)

js如何在指定頁面跳轉到另一指定頁面

1、用js的href函數來實現。 代碼參考:引用script語句=需要跳轉到的頁面跳轉到指定頁面定義和用法href屬性是一個可讀可寫的字符串,可設置或返回當前顯示的文檔的完整URL。

2、測試用返回引用的函數值作為賦值表達式的左值。

3、弄一個名字為網頁跳轉的簡單靜態網頁,網頁內有一張圖片,圖片要置于網如果您在此頁面內跳轉,則可以使用代碼跳轉到指定位置。 轉到指定位置是指向idweizhi的頁面部分的超鏈接。 位置是需要轉移的部分。

4、由上可知,可以通過setHeader來實現某頁面停留若干秒后,自動重定向到另一頁面。

又是該死的js,怎么跳轉到指定tab頁

1、html有一個用js控制的選項卡0003;當點擊html中的2鏈接到html時顯示選項卡02的內容。

2、鍵盤tab鍵的鍵代碼是9,可以用來獲得按下一個鍵時的鍵代碼,進而可以知道按下了哪個鍵。 接著程序找出當前光標所在的文本框,然后將光標移到它的前一個文本框中。

3、--將些鏈接加入到你想跳轉到的位置-#后面的skip你可以自己定義與下面的那個中的對應就可以了!就能實習到指定的位置了。

4、方法如下:首先,選中整個表格,然后點擊右鍵,選擇菜單中的“表格屬性”,這樣會彈出對話框。 在對話框中,切換到“行”選項卡,如下圖。

5、http:///uid--id-html看下這文章。

JS實現頁面跳轉的幾種方式

[1]在頁面的head內加入meta標簽實現[2]js代碼實現setTimeout((0),1000)javascript中的跳轉方法=(-1);//參數是負幾,就后退幾次。

這樣就能實現,參數不丟失了。 主要就是頁碼和篩選條件。 純js頁面跳轉要傳復雜數據不好做,要用localStorage,這個東東在各瀏覽器中是不一樣的。

您好,你這樣用JS實現頁面跳轉是會使整個頁面都跳轉,如果你正在看視頻,點擊下一頁,又要重新加載,這是不符合規范的哦。 網上那些是用的分頁控件,還有一個方法是利用Ajax做。

那你別用js跳轉了,直接用標準html跳轉,這個兼容性最高。

這是典型的分頁,你這個布局是有點問題的。 分頁的頁是動態創建出來的。 HTML:直接一個DIV就行,是分頁的容器!下面是一個分頁的例子的代碼。 我建議你還是網上找一套關于JavaScript分頁的視頻來看,看完自然就懂了。



相關標簽: 利用localstorage做一個歌曲收藏location.href、 Web、 應用程序的調試利用、 簡化、

上一篇:使用locationhref提供直觀的Web應用程序導

下一篇:使用locationhref優化Web應用程序的SEO使用

內容聲明:

1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://m.sycxjdsbhs.com/article/2aaae25f80b34ac7dacf.html,復制請保留版權鏈接!


溫馨小提示:在您的網站做上本站友情鏈接,訪問一次即可自動收錄并自動排在本站第一位!
隨機文章
刷爆朋友圈的短視頻神器:掌握社交流量密碼 (刷爆朋友圈的文案)

刷爆朋友圈的短視頻神器:掌握社交流量密碼 (刷爆朋友圈的文案)

在社交媒體時代,短視頻已經成為傳播信息、吸引流量的重要方式,想要在朋友圈中脫穎而出,一款優秀的短視頻神器必不可少,本文將為你介紹幾款刷爆朋友圈的短視頻神器,以及一些刷爆朋友圈文案的技巧,刷爆朋友圈的短視頻神器1.剪映剪映是一款功能強大的短視頻編輯軟件,操作簡單,功能豐富,它提供了豐富的特效、轉場、貼紙和音樂素材,可以滿足各種短視頻創作...。

最新資訊 2024-10-01 17:51:02

免費的圖表制作工具和 JavaScript 圖表庫 (免費的圖表制作工具)

免費的圖表制作工具和 JavaScript 圖表庫 (免費的圖表制作工具)

圖表對于可視化數據非常重要,但創建圖表可能很費時且具有挑戰性,這就是為什么使用免費的圖表制作工具和JavaScript圖表庫來簡化流程至關重要的原因,免費的圖表制作工具GoogleCharts,Google提供的一套全面的圖表制作工具,提供各種圖表類型,它易于使用,可與GoogleSheets和GoogleDataStudio等其他G...。

最新資訊 2024-10-01 12:42:59

了解心血漏洞的潛在危險:軟件開發中的關鍵弱點 (了解心血漏洞的人)

了解心血漏洞的潛在危險:軟件開發中的關鍵弱點 (了解心血漏洞的人)

引言在軟件開發領域,心血漏洞是一種嚴重的漏洞,它允許攻擊者獲得對計算機系統的未經授權的訪問,這些漏洞可能對個人、企業和整個行業產生毀滅性的影響,本文旨在闡明心血漏洞的潛在危險,并提供最佳實踐以減輕其風險,什么是心血漏洞,心血漏洞是由軟件中的缺陷或編碼錯誤造成的,它允許攻擊者利用該缺陷訪問計算機系統,這些漏洞通??梢员贿h程利用,這意味著...。

最新資訊 2024-09-25 21:28:50

Ant.jar 的藝術:通過構建自動化提升開發效率 (ant.jar包的作用)

Ant.jar 的藝術:通過構建自動化提升開發效率 (ant.jar包的作用)

簡介Ant,ApacheAnt,是一種基于Java的構建工具,用于自動化構建流程,包括編譯、測試、打包和部署,Ant.jar包是Ant的核心庫,它提供了構建過程的大量功能,通過使用Ant.jar,開發人員可以創建自定義構建腳本,使構建流程更有效、更可重復,Ant.jar的作用Ant.jar提供了許多功能,包括,任務,Ant.jar包含...。

最新資訊 2024-09-16 11:34:21

踏上 C 語言進階之路:掌握二級 C 語言技能 (c語言 進階)

踏上 C 語言進階之路:掌握二級 C 語言技能 (c語言 進階)

前言對于初學者來說,掌握C語言的基礎語法和概念是至關重要的,如果你想要提升自己的C語言技能,達到二級水平,那么你需要深入了解語言的更高級特性,本文將指導你踏上C語言進階之路,幫助你掌握二級C語言技能,提升你的編程能力,二級C語言技能簡介二級C語言技能涵蓋了以下主題,指針和動態內存管理結構體和聯合文件處理預處理器和宏位操作數據結構指針和...。

互聯網資訊 2024-09-11 10:31:05

Java Web 開發:構建強大的 Web 應用程序的綜合指南 (javaweb是前端還是后端)

Java Web 開發:構建強大的 Web 應用程序的綜合指南 (javaweb是前端還是后端)

Javaweb是什么JavaWeb是一個用于開發服務器端應用程序的框架,它使用Java語言和各種庫和框架來創建動態Web頁面、處理用戶請求并生成HTML響應,Javaweb是前端還是后端JavaWeb主要用于后端開發,即處理服務器端的邏輯和數據處理,它與前端技術,如HTML、CSS和JavaScript,配合使用,用于構建用戶界面和處...。

技術教程 2024-09-11 08:18:15

擬合函數:數據分析的強大工具探索數據趨勢和模式 (擬合函數是什么)

擬合函數:數據分析的強大工具探索數據趨勢和模式 (擬合函數是什么)

在數據分析中,擬合函數是一種強大的工具,可以幫助我們探索數據趨勢和模式,通過將數學方程擬合到數據點,我們可以揭示數據的潛在結構,并對未來趨勢進行預測,什么是擬合函數,擬合函數是一種數學方程,它以最合適的方式近似給定數據集,擬合函數通過最小化數據點和函數之間誤差的總和來確定,這種誤差通常用均方誤差,MSE,來衡量,擬合函數的常用類型包括...。

本站公告 2024-09-10 11:05:52

為中國開發者提供動力:編程中國的資源和支持 (為中國開發者提出建議)

為中國開發者提供動力:編程中國的資源和支持 (為中國開發者提出建議)

前言中國作為全球數字化大國,對于開發者而言是一個充滿機遇的沃土,為了助力中國開發者茁壯成長,本文匯集了豐富的資源和支持,旨在為他們的職業發展提供全方位的賦能,教育與培訓在線課程平臺網易云課堂,提供海量免費和付費課程,涵蓋從基礎編程到高級技術,Coursera,與世界名校合作,提供計算機科學、數據科學和AI等領域的認證課程,Udemy,...。

互聯網資訊 2024-09-09 10:03:16

PDO 數據庫操作:支持多種數據庫,例如 MySQL、PostgreSQL 和 SQL Server。(pdo數據庫查詢)

PDO 數據庫操作:支持多種數據庫,例如 MySQL、PostgreSQL 和 SQL Server。(pdo數據庫查詢)

PDO,PHPDataObjects,是PHP中的一個擴展,它提供了一個統一的接口來訪問不同的數據庫管理系統,DBMS,這意味著你可以使用相同的代碼與MySQL、PostgreSQL和SQLServer等不同的數據庫交互,PDO優勢使用PDO有一些優勢,包括,統一的接口,PDO提供了一個統一的接口,用于與不同的數據庫交互,簡化了與不...。

本站公告 2024-09-07 23:31:54

Java中的視頻編碼和解碼:優化視頻配信 (java中的基本數據類型有哪些)

Java中的視頻編碼和解碼:優化視頻配信 (java中的基本數據類型有哪些)

Java中的視頻編碼和解碼,優化視頻傳輸介紹在當今數字世界中,視頻已成為至關重要的一部分,從流媒體服務到視頻會議,視頻無處不在,為了在互聯網上有效地傳輸視頻,需要對其進行編碼和解碼,Java中的視頻編碼視頻編碼是將未壓縮視頻數據轉換為壓縮視頻格式的過程,這可以通過使用編解碼器,編解碼器,來實現,它是一種執行編碼和解碼操作的軟件或硬件組...。

本站公告 2024-09-07 21:49:20

釋放數據潛力的鑰匙:Random函數在機器學習中的作用 (釋放數據潛力英文翻譯)

釋放數據潛力的鑰匙:Random函數在機器學習中的作用 (釋放數據潛力英文翻譯)

在機器學習中,數據是至關重要的,它為算法提供學習和做出預測所需的信息,數據通常是混亂和無序的,這使得機器學習算法很難從中提取有用的模式,因此,隨機性在機器學習中起著至關重要的作用,Random函數就是其中的一個關鍵工具,什么是Random函數,Random函數是一個用于生成偽隨機數的計算機函數,雖然這些數字實際上并非完全隨機,但它們看...。

技術教程 2024-09-07 02:47:17

網頁ps怎么使用教程網頁ps怎么使用教程視頻 (網頁ps怎么摳圖)

網頁ps怎么使用教程網頁ps怎么使用教程視頻 (網頁ps怎么摳圖)

如何使用photoshop制作網頁很多朋友不知道用ps制作網頁的規范,下面介紹一下,01打開電腦中的Photoshop界面,首先,我們創建一個畫布,寬度為1200,任意高度,分辨率為72,02畫布創建完成后,我們在1200px左右兩邊拉一條輔助線固定,03然后打開畫布大小,取消,相對,,寬度調整為1920px,04設置好之后,在紅色區...。

技術教程 2024-09-02 00:56:33

Copyright ? 2025 聚集網 All Rights Reserved
此內容系本站根據來路自動抓取的結果,不代表本站贊成被顯示網站的內容或立場。
本頁閱讀量次 | 本站總訪問次 | 本站總訪客人 | 今日總訪問次 | 今日總訪客人 | 昨日總訪問次 | 昨日總訪客人 |
技術支持:聚集網

国产精品成人免费视频_91丝袜美腿美女视频网站_国产一区二区三区在线看_亚洲欧美另类中文字幕_在线电影av不卡网址_国产视频丨精品|在线观看_日韩一区二区三区国产_国产欧美va欧美va香蕉在线_热re91久久精品国99热蜜臀_亚洲第一精品电影_久久九九亚洲综合_国产成人综合精品_97视频在线观看网址_精品视频久久久久久_日韩av片免费在线观看_久久精品国产99国产精品澳门
在线观看欧美日韩国产| 亚洲一区二区久久久| 色阁综合伊人av| 国产在线观看精品一区二区三区| 国产成人91久久精品| 18一19gay欧美视频网站| 欧美精品情趣视频| 日韩成人av一区| 91精品视频在线免费观看| 久久伊人91精品综合网站| 精品免费在线观看| 国产精品嫩草影院一区二区| 91免费国产网站| 尤物九九久久国产精品的特点| 日韩中文字幕免费视频| 久久久噜噜噜久噜久久| 亚洲成人黄色在线观看| 国产精品电影一区| 国产精品第1页| 欧美性猛交丰臀xxxxx网站| 国产成人黄色av| 久久久在线免费观看| 国产精品久久久久久久久影视| 亚洲男人天天操| 色综合色综合久久综合频道88| 97香蕉久久超级碰碰高清版| 麻豆一区二区在线观看| 欧美猛交ⅹxxx乱大交视频| 国产精品日韩欧美综合| 欧美在线观看日本一区| 国产97在线|日韩| 国产精品一区av| 国产精品一二三视频| 国产精品福利无圣光在线一区| 97国产一区二区精品久久呦| 久久国产精品久久久久| 久久久久久久久久久免费精品| 色999日韩欧美国产| 亚洲日本成人网| 伊人久久大香线蕉av一区二区| 日韩激情片免费| 亚洲成人激情在线观看| 成人黄色av网| 国产成人一区二区三区电影| 欧美激情成人在线视频| 国产精品678| 亚洲精品第一国产综合精品| 欧美视频中文字幕在线| 91色p视频在线| 久久大大胆人体| 国产成人久久久| 日韩精品高清在线观看| 91av在线国产| 久久精视频免费在线久久完整在线看| 高潮白浆女日韩av免费看| 亚洲成人久久电影| 亚洲精品福利在线观看| 亚洲深夜福利在线| 中国china体内裑精亚洲片| www.欧美三级电影.com| 国产噜噜噜噜噜久久久久久久久| 国产精品99免视看9| 日韩国产欧美区| 国产日韩精品视频| 日韩免费观看在线观看| 亚洲网站视频福利| 精品成人69xx.xyz| 欧美日韩综合视频| 日本国产精品视频| 亚洲欧美日韩精品| 亚洲人成电影网站| 日本精品免费一区二区三区| 91精品国产综合久久香蕉922| 最近2019中文字幕一页二页| 久久免费成人精品视频| 国产福利成人在线| 日韩美女免费线视频| 久色乳综合思思在线视频| 国产精品自拍偷拍| 欧美性少妇18aaaa视频| 亚洲图片欧美午夜| 中国日韩欧美久久久久久久久| 欧美专区福利在线| 国产欧美欧洲在线观看| www高清在线视频日韩欧美| 日韩国产在线播放| 久久免费国产视频| 国产成人精品视频在线观看| 97碰碰碰免费色视频| 久久人人爽人人爽爽久久| 国产精品一区久久久| 国产精品久久久久久久久| 欧美激情videoshd| 久久精品视频va| 日本高清久久天堂| 在线日韩日本国产亚洲| 亚洲美女精品成人在线视频| 国产成人精品亚洲精品| 国产成人综合精品在线| 亚洲石原莉奈一区二区在线观看| 国产在线观看不卡| www.久久久久久.com| 中文字幕精品久久久久| 国内精久久久久久久久久人| 97人人爽人人喊人人模波多| 国产精品盗摄久久久| 成人xvideos免费视频| 精品亚洲一区二区| 亚洲欧美一区二区精品久久久| 亚洲黄色在线观看| 国产精品高清网站| 日韩av片永久免费网站| 亚洲深夜福利视频| 久久精品国产v日韩v亚洲| 久久久中精品2020中文| 欧美一级电影免费在线观看| 久久精品亚洲94久久精品| 亚洲一区二区在线播放| 久久精品视频99| 精品日本美女福利在线观看| 亚洲精品日韩激情在线电影| 久久精品视频网站| 成人黄色午夜影院| 夜色77av精品影院| 亚洲视频视频在线| 疯狂蹂躏欧美一区二区精品| 精品久久久久久中文字幕一区奶水| 亚洲自拍偷拍一区| 亚洲一区二区三区在线免费观看| 日韩中文字幕第一页| 亚洲一区二区三区sesese| 国产精品欧美风情| 亚洲韩国青草视频| 亚洲色图在线观看| 一本色道久久88亚洲综合88| 九九久久精品一区| 美女扒开尿口让男人操亚洲视频网站| 亚洲国产成人精品久久久国产成人一区| 日韩少妇与小伙激情| 色爱av美腿丝袜综合粉嫩av| 久久天堂av综合合色| 亚洲欧美中文日韩在线| 久久99久久亚洲国产| 欧美大片免费观看在线观看网站推荐| 亚洲综合中文字幕在线观看| 在线观看91久久久久久| 国产啪精品视频网站| 欧美精品999| 欧美xxxx14xxxxx性爽| 亚洲精品视频免费在线观看| www.久久草.com| 亚洲美女av网站| 日韩电影免费在线观看| 91久久精品国产91久久| 欧美激情亚洲另类| 98精品国产高清在线xxxx天堂| 日韩精品视频在线观看免费| 亚洲天堂成人在线视频| 日韩av电影手机在线观看| 2018中文字幕一区二区三区| 亚洲国产精品美女| 国内精品国产三级国产在线专| 欧洲成人性视频| 亚洲毛茸茸少妇高潮呻吟|