js跨域

跨域問題是由於javascript語言安全限制中的同源策略造成的.

簡單來說,同源策略是指一段腳本只能讀取來自同一來源的窗口和文檔的屬性,這裏的同一來源指的是主機名、協議和端口號的組合.

  • js不能跨域請求數據,但可以跨域請求js片段(jsonp)。
  • 可以在把數據如Json包裝爲一個js片段,可以把數據使用js方法來包裝,形成一條方法的調用語句。
  • 可以使用ajax請求js片段,當js判斷到達瀏覽器會被立即執行。
  • 在瀏覽器端,先創建好回調方法,在回調方法中通過參數可以獲得請求的數據。

比如數據爲一段json,{“name”: “testName”},則可以在客戶端定義一個方法如

function callback(json){
    console.log(json);
}

然後在服務器端將json數據包裝:

callback({“name”: "testName"});
//@RequestMapping()中需要設置屬性:
//produces=MediaType.APPLICATION_JSON_VALUE+";charset=utf-8"
//是設置返回數據的編碼格式,防止亂碼。

這樣在客戶端用ajax請求時就可以成功,而且js片段到達客戶端是立即執行的,在客戶端會執行callback方法。

服務器端包裝數據的時候,有是需要包裝,有時不需要,但包裝的話需要用到String連接方法名,所以我們需要將json轉化爲String。

String json = JsonUtils.objectToJson(result);

這樣就可以把json轉化爲String類型。

另一種方式:

@RequestMapping("directives.json")
@ResponseBody
public MappingJacksonValue directives(String callback) {
    MappingJacksonValue mappingJacksonValue = new MappingJacksonValue("you can put everything here.");
    mappingJacksonValue.setJsonpFunction(callback);
    return mappingJacksonValue;
}

其中,callback爲請求傳遞過來的方法名
mappingJacksonValue的setJsonFunction()方法可以將方法名加到數據的外面,即包裝數據。
JsonP不僅能用在ajax請求中,在<script>標籤中也同樣可以,即設置其src屬性.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章