1. 程式人生 > 其它 >寫一個jsonp的例項來實現跨域

寫一個jsonp的例項來實現跨域

技術標籤:javascriptjavascript

由於瀏覽器同源策略的限制,非同源下的請求,都會產生跨域問題,jsonp即是為了解決這個問題出現的一種簡便解決方案。

前輩們發現不管是script標籤的src還是img標籤的src,或者說link標籤的href他們沒有被通源策略所限制,於是我也來湊湊熱鬧,用script標籤來寫一個簡單的例子:

頁面程式碼:


<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=GBK">
        </head>
        <body>
        
        <p id="txt"></p>
        <button onclick="do_jsonp()">獲取資料</button>
        </body>
<script>
	function _doJsonP(url,data,callback){
			var me=this;
			//產生隨機數
	        var fnSuffix=Math.random().toString().replace('.','');
	        //回撥函式名
	        var cb='jsonp_cb_'+fnSuffix;
	        // 將data轉化成url字串的形式
	        var param=url.indexOf('?')==-1?'?':'&';
	        for(var key in data){
	            param+=key+'='+data[key]+'&';
	        }
	        //將需要回調的函式名傳到後臺
	        param+='cb='+'jsonp_cb.'+cb;
	        //建立一個script的標籤
	        var scriptElement=document.createElement('script');
	        //設定src
	        scriptElement.src=url+param;
	        //將script標籤放到頁面中
	        var head = document.getElementsByTagName('head');
	        var scriptContainer = head ? head[0] : document.body;
	        	scriptContainer.appendChild(scriptElement);
	       
	        window['jsonp_cb']={};	
	     	//建立回撥函式
	        window['jsonp_cb'][cb] = function(res){
	        	//呼叫回撥函式
	        	callback(res);
	        	delete window['jsonp_cb'][cb];
	        	//將此script元素刪除
	        	scriptContainer.removeChild(scriptElement);
	        }

		}
	

	
	function do_jsonp(){
		var url="http://192.168.56.1:8080/yszdServer/entry?method=test_jsonp";
		var data={'a':1,b:'2'};
		_doJsonP(url,data,function(text){
			document.getElementById("txt").innerText=JSON.stringify(text);
		});
	}
	
	
</script>
</html>

後臺java程式碼:

	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		resp.addHeader("Access-Control-Allow-Origin", "*");  
		req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        String dataString = "";
        String callback = (String)req.getParameter("cb");
        String a = (String)req.getParameter("a");
    	String b = (String)req.getParameter("b");
    	dataString = "{\"a\":\""+a+"\",\"b\":\""+b+"\"}";
    	
    	PrintWriter out = resp.getWriter();
	    if(callback!=null && callback.length()>0){
	    	dataString =callback+"("+dataString+")";
        }
		out.println(dataString);
		out.close();
}

測試一下 :

點選按鈕後將傳到後臺的資料a、b獲取到,並展示!

歡迎指正,謝謝點贊!