跨域與跨域訪問

什么是跨域

跨域是指從一個域名的網頁去請求另一個域名的資源。比如從www.baidu.com 頁面去請求 www.google.com 的資源。跨域的嚴格一點的定義是:只要 協議,域名,端口有任何一個的不同,就被當作是跨域

為什么瀏覽器要限制跨域訪問呢?

原因就是安全問題:如果一個網頁可以隨意地訪問另外一個網站的資源,那么就有可能在客戶完全不知情的情況下出現安全問題。比如下面的操作就有安全問題:

  1. 用戶訪問www.mybank.com ,登陸并進行網銀操作,這時cookie啥的都生成并存放在瀏覽器
  2. 用戶突然想起件事,并迷迷糊糊地訪問了一個邪惡的網站 www.xiee.com
  3. 這時該網站就可以在它的頁面中,拿到銀行的cookie,比如用戶名,登陸token等,然后發起對www.mybank.com 的操作
  4. 如果這時瀏覽器不予限制,并且銀行也沒有做響應的安全處理的話,那么用戶的信息有可能就這么泄露了。

為什么要跨域

既然有安全問題,那為什么又要跨域呢? 有時公司內部有多個不同的子域,比如一個是location.company.com ,而應用是放在app.company.com , 這時想從 app.company.com去訪問 location.company.com 的資源就屬于跨域

跨域訪問需要的兩件寶貝

由于瀏覽器一般不對script,img等進行跨域限制,所以我們有機會通過script的方式來實現跨域訪問。

跨域訪問需要用到兩樣東東,一個是JSON,一種基于文本的傳輸協議;一種是JSONP,一群碼農想出來的跨域解決方案。關于JSON與JSONP的解釋,可以參考?JSON & JSONP

實現跨域訪問 服務端需要做什么

服務端要檢查訪問的請求參數,如果沒有callback,則可以按照之前的流程走;如果帶著callback參數,則需要將返回的結果包裝在callback里面。

比如請求的URL是: app.company.com/location?callback=myCallback , 那么服務端則需要把結果封裝進myCallback 函數里面, 如下

if (params.query && params.query.callback) {//console.log(params.query.callback);var str =  params.query.callback + '(' + JSON.stringify(data) + ')';//jsonpres.end(str);} else {res.end(JSON.stringify(data));//普通的json}     

實現跨域訪問 客戶端需要做什么

客戶端有多種方式可以實現JSONP的調用:

  • jQuery?
    jQuery可以在Ajax里面設置datatype為jsonp,則可以進行跨域訪問
    $scope.jqueryJsonpRequest = function(){jQuery.ajax({type: "get",async: false,url: "https://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts",dataType: "jsonp",jsonp: "callback",//傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的參數名(一般默認為:callback)jsonpCallback:"flightHandler",//自定義的jsonp回調函數名稱,默認為jQuery自動生成的隨機函數名,也可以寫"?",jQuery會自動為你處理數據success: function(json){alert('success' + JSON.stringify(json));},error: function(){alert('fail');}});};
  • AngularJS?
    AngularJS的$http 也提供了對jsonp的訪問,直接調用jsonp進行跨域訪問
$http.jsonp('https://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=JSON_CALLBACK').success(function(data){alert('success:'+data);}).error(function(err){alert('error:'+err);});
  • 手動實現?
    不管是jQuery也好,AngularJS也罷,底下都不是發起XHR (XML HTTP Request),而都是通過加載javascript的方式來做的,所以如果項目沒有依賴jQuery或者AngularJS,則可以自己手動實現jsonp的調用。

    原理很簡單,就是用javascript動態加載一個script文件,同時定義一個callback函數給script執行而已。

    //定義callback 函數
    var myCallbackFunction = function(data){// 對返回的數據做后續處理alert('uuu:'+JSON.stringify(data));}
    //把callback函數賦給window對象,供script回調   
    window.myCallbackFunction = myCallbackFunction;
    //創建并加載script
    var script = document.createElement('script');
    script.src = 'https://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=myCallbackFunction';
    document.body.appendChild(script);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451242.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451242.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451242.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

thymeleaf 使用javascript定義數組報錯

js中免不了的要用的數組,一維的二維的三維的 但是當用到thymeleaf作為模版時候會有一些坑,導致數組不能用 org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "{checkbox: true, fixed: true}, {field: origi…

解決:Failed to execute goal on project aopcore: Could not resolve dependencies for project com.cmos:

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、問題描述 maven工程 jar包無法下載,報錯如下 : [ERROR] Failed to execute goal on project aopcore: Cou…

從Xbox和Zune中學到的四門創業課

導讀:微軟前娛樂與設備部門總裁Robbie Bach領導他的團隊,實現了Xbox的暢銷。然而,他領導該部門推出的Zune音樂播放器,卻沒那么成功。從Robbie這兩個經歷中,我們們能學到什么?本文是Robbie自己的總結&#x…

服務容錯保護斷路器Hystrix之七:做到自動降級

從《高可用服務設計之二:Rate limiting 限流與降級》中的“自動降級”中,我們這邊將系統遇到“危險”時采取的整套應急方案和措施統一稱為降級或服務降級。想要幫助服務做到自動降級,需要先做到如下幾個步驟: 可配置的降級策略&am…

from表單提交和JSON區別

form表單是“鍵值對”的數據格式,例如: a1&b2&c3 而json格式則與之不同,如下: {"a":1,"b":2,"c":3} 傳遞的數據比較簡單,那么兩種方式基本上沒什么大區別(當然后臺接…

在一個數組中,如何確定所需元素在數組中的位置.

package wac.wev.LianXi; public class CiShu {public static void main(String[] args){//創建一個數組int[] arr {101,23,123,34,13};int y Yuan(arr,13);System.out.println(y);}//1)明確返回值:int//2)明確形式參數:int[] arr 和 int value(value表示所需元素)public stati…

Java實現Excel導入數據庫,數據庫中的數據導入到Excel

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 實現的功能: Java實現Excel導入數據庫,如果存在就更新數據庫中的數據導入到Excel1、添加jxl.jar mysql-connect…

FreeBSD 10 將使用 Clang 編譯器替換 GCC

來自 phoronix 的消息稱,根據 FreeBSD 2012 第一季度的狀態報告 顯示,來自 LLVM 的 Clang 編譯器將成為 FreeBSD 10 的默認 C/C 編譯器,廢棄使用 GPL 授權協議的 GCC,而 Clang 的授權協議是 BSD。 Clang 是一個 C 編寫、基于 L…

HashMap中數組初始化的秘密

2019獨角獸企業重金招聘Python工程師標準>>> 我們知道,在新建一個HashMap對象時,無論傳的initialCapacity參數值為多少,最總HashMap中數組的長度始終為2的n次方,代碼如下: static final int tableSizeFor(i…

PLSQL 安裝+配置( Oracle數據庫連接工具 )

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.找到免安裝版本 PLSQL 解壓到自己想放的位置 (比如 D:\ChengXu\PLSQL\PLSQL) 2.配置環境變量 : 系統變量…

什么是Nginx?為什么使用Nginx?

一、前言為毛要用nginx服務器代理,不直接用tomcat 7.0,還做多了一次接請求?這個是我想問的,公司的新項目是要用Nginxtomcat7jdk開發的,用戶命名可以直接訪問tomcat,為啥還要用Nginx?這貨是個啥玩…

遵循五大設計理念 打造出色設計師

與其他設計不同,網頁設計會隨著時間的改變而不斷改變著。因此,網頁設計師需要不斷的自我提升,了解最前沿的設計趨勢以便能夠設計出更加新穎的網站。 兩年前,網頁設計呈現出一片新的思維方式和新穎的設計趨勢使得該領域彰顯出一片…

shell符號

*: 通配符 *.c : c結尾的文件 *v : v結尾的文件 v* : v開頭的文件轉載于:https://www.cnblogs.com/runlgs/p/9685751.html

偽共享和緩存行填充,Java并發編程還能這么優化!

前言 關于偽共享的文章已經很多了,對于多線程編程來說,特別是多線程處理列表和數組的時候,要非常注意偽共享的問題。否則不僅無法發揮多線程的優勢,還可能比單線程性能還差。隨著JAVA版本的更新,再各個版本上減少偽共享…

mysql中like % %模糊查詢

1,%:表示任意0個或多個字符。可匹配任意類型和長度的字符,有些情況下若是中文,請使用兩個百分號(%%)表示。 比如 SELECT * FROM [user] WHERE u_name LIKE %三% 將會把u_name為“張三”,“張貓三…

Java中判斷字符串是否為數字的五種方法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 推薦使用第二個方法,速度最快。 方法一:用JAVA自帶的函數 Java代碼 public static boolean isNumeric(String…

慕學在線網0.4_xadmin后臺管理

admin是基于Django開發的后臺管理框架,方便,快捷,而且簡單;   而xadmin就相當于admin的升級版,更加強大。    1、安裝xadmin(源碼安裝方式)  教程 PS: - 卸載pip安裝的xadminp…

從一次換機器的過程談軟硬件的分離

今天把在公司使用的計算機更換了一臺,原來是Dell的780,換成了Dell的790,機箱的樣子變化比較大,但是里面硬件的配置變換并不大,最明顯的變化就在于CPU,其他像內存、硬盤等等的配置與原來的計算機基本上一致。…

知其所以然~redis的原子性

原子性 原子性是數據庫的事務中的特性。在數據庫事務的情景下,原子性指的是:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。 對于Redis而言&#xf…

JoinPoint的用法

JoinPoint 對象 JoinPoint對象封裝了SpringAop中切面方法的信息,在切面方法中添加JoinPoint參數,就可以獲取到封裝了該方法信息的JoinPoint對象. 常用api: 方法名功能Signature getSignature();獲取封裝了署名信息的對象,在該對象中可以獲取到目標方法名,所屬類的Class等信息…