1. 程式人生 > >spring mvc ajax jsonp 跨域請求 返回值 配置

spring mvc ajax jsonp 跨域請求 返回值 配置

背景:

AJAX向後臺(springmvc)傳送請求,報錯:已阻止交叉源請求:同源策略不允許讀取 http://127.0.0.1:8080/DevInfoWeb/getJsonp 上的遠端資源。可

以將資源移動到相同的域名上或者啟用 CORS 來解決這個問題。

百度一下,發現是遇到了跨域請求請求問題。蒐集資料如下

JSONP解釋

在解釋JSONP之前,我們需要了解下”同源策略“這個概念,這對理解跨域有幫助。基於安全的原因,瀏覽器是存在同源策略機制的,同源策略阻止從一個源載入的文件或指令碼獲取或設定另一個源載入額文件的屬性。有點繞,說的簡單點就是瀏覽器限制指令碼只能和同協議、同域名、同埠的指令碼進行互動。

JSONP就是為了解決這一問題的,JSONP是英文JSON with Padding的縮寫,是一個非官方的協議。他允許服務端生成script tags返回值客戶端,通過javascript callback的形式來實現站點訪問。JSONP是一種script tag的注入,將server返回的response新增到頁面是實現特定功能。

簡而言之,JSONP本身不是複雜的東西,就是通過scirpt標籤對javascript文件的動態解析繞過了瀏覽器的同源策略。

JSONP原理及實現

接下來,來實際模擬一個跨域請求的解決方案。後端為Spring MVC架構的,前端則通過Ajax進行跨域訪問。

1、首先客戶端需要註冊一個callback(服務端通過該callback(jsonp)可以得到js函式名(jsonpCallback)),然後以JavaScript語

法的方式,生成一個function

2、接下來,將JSON資料直接以入參的方式,放置到function中,這樣就生成了一段js語法文件,返回給客戶端。

3、最後客戶端瀏覽器動態的解析script標籤,並執行返回的JavaScript語法文件片段,此時資料作為引數傳入到了預先定義好的

回撥函式裡(動態執行回撥函式)。

這種動態解析js文件和eval函式是類似的。

經過一番努力,解決如下:

SpringMVC端:

 @RequestMapping("/get")  
     public void get(HttpServletRequest req,HttpServletResponse res) {  
         res.setContentType("text/plain");  
         String callbackFunName =req.getParameter("callbackparam");//得到js函式名稱  
         try {  
             res.getWriter().write(callbackFunName + "([ { name:\"John\"}])"); //返回jsonp資料  
         } catch (IOException e) {  
             e.printStackTrace();  
         }  
     }  
       
     @RequestMapping("/getJsonp")  
     @ResponseBody  
     public JSONPObject getJsonp(String callbackparam){  
    Company company=new Company();  
    company.setAddress("廣州天河華景軟體園");  
    company.setEmail("
[email protected]
"); company.setName("廣州訊動網路可以有限公司"); company .setPhone("12345678912"); return new JSONPObject(callbackparam, company); }

AJAX端:
 <!DOCTYPE html>  
    <html>  
    <head>  
    <meta charset="utf-8">  
        <script src="http://code.jquery.com/jquery-2.1.3.min.js"></script>  
    <script>  
    $(document).ready(function(){  
          
          
    $("#but1").click(function(){  
         $.ajax({  
            url:'http://127.0.0.1:8080/DevInfoWeb/get',  
            type: "get",  
            async: false,  
            dataType: "jsonp",  
            jsonp: "callbackparam", //服務端用於接收callback呼叫的function名的引數   
            jsonpCallback: "success_jsonpCallback", //callback的function名稱,服務端會把名稱和data一起傳遞回來   
            success: function(json) {  
             alert(json);  
            },  
            error: function(){alert('Error');}  
    });  
    });  
      
      
    $("#but2").click(function(){  
         $.ajax({  
            url:'http://127.0.0.1:8080/DevInfoWeb/getJsonp',  
            type: "get",  
            async: false,  
            dataType: "jsonp",  
            jsonp: "callbackparam", //服務端用於接收callback呼叫的function名的引數   
            jsonpCallback: "success_jsonpCallback", //callback的function名稱,服務端會把名稱和data一起傳遞回來   
            success: function(json) {  
             alert(json);  
            },  
            error: function(){alert('Error');}  
    });  
    });  
      
      
    });  
    </script>  
    </head>  
    <body>  
      
    <div id="div1"><h2>使用 jQuery AJAX 來改變文字</h2></div>  
    <button id="but1">按鈕1</button> <br/>  
    <button id="but2">按鈕2</button>  
      
    </body>  
    </html>  

參考文章:


相關推薦

spring mvc ajax jsonp 請求 返回 配置

背景: AJAX向後臺(springmvc)傳送請求,報錯:已阻止交叉源請求:同源策略不允許讀取 http://127.0.0.1:8080/DevInfoWeb/getJsonp 上的遠端資源。可 以將資源移動到相同的域名上或者啟用 CORS 來解決這個問題。 百度

Spring Boot支援JSONP請求資料(Ajaxjsonp)

1:在Spring Boot的Api伺服器上進行配置 package me.loveshare.note1.configuration; import org.springframework.web.

spring mvc支持請求

ces 跨域 cred access max 支持跨域 ons origin ont @WebFilter(urlPatterns = "/*", filterName = "corsFilter") public class CorsFilter implements

Ajax-jsonp請求簡單樣例

Ajax-jsonp跨域請求說明 1.簡要說明:  跨域的安全限制都是對瀏覽器端來說的,伺服器端是不存在跨域安全限制的。瀏覽器的同源策略限制從一個源載入的文件或指令碼與來自另一個源的資源進行互動。如果協議,埠和主機對於兩個頁面是相同的,則兩個頁面具有相同的源,否則就是不同源的。如果

jQuery jsonp請求 ajax之---伺服器端代理實現

  ajax跨域之---伺服器端代理實現 https://www.cnblogs.com/lydialee/p/4869145.html   來源   https://www.cnblogs.com/chiangchou/p/jsonp.html

js原生態請求ajaxjsonp請求

在web開發中我們經常會說起指令碼的跨域訪問的問題,會出現跨域訪問的限制是因為javascript語言安全限制中的同源策略(same-origin policy )所造成的。 同源策略簡單的說就是一段指令碼只能讀取來自於同一來源的資源,這裡的同一來源指的是主機

JQuery+ajax+jsonp 訪問

url .text java jquery rip getjson round show ajax <html> <head> <meta http-equiv="Content-Type" content="text/html; c

jsonp請求

innerhtml 問題 += outline html www. arr 方法 ctype 跨域是什麽?為什麽我們需要跨域? 跨域是指瀏覽器訪不能問另外一個網站的腳本,這是由於瀏覽器的同源策略造成的,同時也是瀏覽器施加給javascript的安全限制。 但是事實上,用戶瀏

jQuery jsonp請求詳解

路徑 下使用 utf 顯示 我們 ole show height json 跨域的安全限制都是對瀏覽器端來說的,服務器端是不存在跨域安全限制的。 瀏覽器的同源策略限制從一個源加載的文檔或腳本與來自另一個源的資源進行交互。 如果協議,端口和主機對於兩個頁面是相同的,則兩個頁面

【轉載】Ajax JS 請求

-h 資源 pla dom light data 常用 clas json 原文: 簡單的ajax請求:http://blog.csdn.net/net_lover/article/details/5172509 復雜的ajax請求:http://blog.csdn.net

ajax本地請求以及解決方法

同源策略 AC something 三種 n) req apache2.4 策略 cor 什麽是跨域? ??我們通常所說的跨域是狹義的,是由瀏覽器同源策略限制的一類請求場景。所謂同源是指"協議+域名+端口"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源,只要沒有同

jsonp請求php接口

jsonp 跨域 php 使用JQ和原生PHP作為例子: JS代碼: <script src="JQ的地址" type="text/javascript"></script> <script> var testApi = "跨域的地址"; $.ajax({

輕松搞定JSONP請求

set 合同 bsp 豆瓣 con 註意 wiki str ref 一、同源策略 要理解跨域,先要了解一下“同源策略”。所謂同源是指,域名,協議,端口相同。所謂“同源策略“,簡單的說就是基於安全考慮,當前域不能訪問其他域的東西。 一些常見的是否同源示例可參照下表: 在同源

jsonp請求,常見的集中書寫方式,及優缺點比較

簡介     符合Web2.0特徵的眾多網站一個明顯的特點就是採用Ajax。Ajax提供了在後臺提交請求訪問資料的功能。其實現主要使用的是XMLHttpRequest函式,這個函式允許客戶端的Javascript傳送到伺服器端的HTTP請求並獲得返回資料。Ajax同時也是

[jQuery] jsonp請求

以下內容來源:https://www.cnblogs.com/chiangchou/p/jsonp.html,本文只做記錄。   jQuery jsonp跨域請求   跨域的安全限制都是對瀏覽器端來說的,伺服器端是不存在跨域安全限制的。 瀏覽器的同源策略限制從

轉-jQuery jsonp請求

跨域的安全限制都是對瀏覽器端來說的,伺服器端是不存在跨域安全限制的。 瀏覽器的同源策略限制從一個源載入的文件或指令碼與來自另一個源的資源進行互動。 如果協議,埠和主機對於兩個頁面是相同的,則兩個頁面具有相同的源,否則就是不同源的。 如果要在js裡發起跨域請求,則要進行一些特殊處理了。或者,你可以把請求發

jQuery jsonp請求 jQuery jsonp請求

jQuery jsonp跨域請求   跨域的安全限制都是對瀏覽器端來說的,伺服器端是不存在跨域安全限制的。 瀏覽器的同源策略限制從一個源載入的文件或指令碼與來自另一個源的資源進行互動。 如果協議,埠和主機對於兩個頁面是相同的,則兩個頁面具有相同的源,否則就是不同源的。

Spring MVC 登陸實現

適用於 4.2版本以上 ,在@Controller 的方法加上@CrossOrigin即可 @RequestMapping(value = "login", method = { RequestMethod.POST }) @CrossOrigin @ResponseBody pu

jsonp請求報錯Uncaught SyntaxError: Unexpected token :

jsonp跨域請求報錯Uncaught SyntaxError: Unexpected token :遇到就記錄一下: 通過自己不斷倒騰和看別人的部落格,總結如下: 前端程式碼: <div class="container"> <p>更新資訊</p&

php ajax jsonp 兩種方式

第一種方式客戶端程式碼案例 第一種方法重點是服務端加header頭------》header("Access-Control-Allow-Origin: *"); 客戶端程式碼 header("Access-Control-Allow-Origin: *"); $data = $r