java+jQuery 處理跨域問題

最近做了一個項目,想在一個靜態網頁中直接請求外部服務器中的接口,實現數據共享,但是我當時忽略了一個問題,那就是跨域的問題。因爲之前一直沒有處理過這樣的問題,就掉進這個坑中了。不過我還是很興奮,早晚都是要掉進這個坑的,那麼早掉進去比晚掉進去更加有意義。自己查了很多是資料都市寫的不是很通俗易懂。也踩了不少的雷。現在吧我的解決方式和理解獻下:

1、{"readyState":4,"status":200,"statusText":"load"}

ajax使用jsonp跨域調用webservice error錯誤信息"readyState":4,"status":200,"statusText":"success"

參考解析:https://blog.csdn.net/sinat_20846487/article/details/51782547


 $.ajax({
            type: 'GET',
            url: 'http://192.168.0.164:8080/downloadurl/downloadurlOfUrlForJsonp',
            dataType: 'jsonp',  // 請求方式爲jsonp
            jsonp: "callback",    // 自定義回調函數名
            async: false, //是否異步
            success: function (json) { //成功的回調函數\
                alert(JSON.stringify(json));
            },
            error: function (data) {
                alert("error:"+JSON.stringify(data));
            }
        });

結果進入erro:但是輸出的報錯信息爲:“{"readyState":4,"status":200,"statusText":"success"}"
原因是webservice 返回的數據不是正確的jsonp格式
或者同一個webservice中處理多個jsonq請求,且jsonCallback都缺省
此時使用String callbackFunName=context.Request["jsapicallback"];
...  context.Response.Write(callbackFunName + rdata);的方式 ,無法正確獲取帶有callback方法名的jsonp對象,所以jsonpCallback儘量不要省略


注意:
即使是使用jsonp 來處理跨域的時候也要嚴格的按照jsonp 的格式來進行處理。不然會出現是請求成功,但是會執行到Erro中,而不是執行到了success中去。

前端:
 $.ajax({
            type: 'GET',
            url: 'http://192.168.0.164:8080/downloadurl/downloadurlOfUrlForJsonp',
            dataType: 'jsonp',  // 請求方式爲jsonp   
            jsonpCallback:"successCallback",// 自定義回調函數名
            async: false, //是否異步
            success: function (json) { //成功的回調函數\
                $("#android").attr("href",json.android);
                $("#ios").attr("href",json.ios);
            },
            error: function (data) {
                alert("error:"+JSON.stringify(data));
            }
        });
說明:
1、前端的請求方式必須是GET,jsonP是暫時不支持POST方式的
2、請求方式必須是jsonp
3、jsonpCallback:後端返回的json結果集的名字,也是後端返回的回調函數名後端返回的數據的固定格式:
successCallback({"android":"http://ylzxdown.oss-cn-shenzhen.aliyuncs.com/apk/ylzxsc.apk","ios":"https://fir.im/auy8"})
 
4、successCallback   是必須要和前端的  jsonpCallback:"successCallback",// 自定義回調函數名
相對應。
5、 jsonp:'jsoncallback',//自定義參數名稱(這個參數是可要可不要的)

且必須要加上括號,因爲是一個函數

說說後端:
@RequestMapping("/downloadurlOfUrlForJsonp")
    public void downloadurlOfUrlForJsonp(HttpServletRequest req, HttpServletResponse rps) {
        Map<String, String> map = null;
        List<Downloadurl> list = downloadurlService.selectList(null);
        if (ToolUtil.isNotEmpty(list)) {
            map = list.stream().collect(Collectors.toMap(Downloadurl::getUrlname, Downloadurl::getUrl));
        }
        try {
            rps.getWriter().print("successCallback(" + JSONObject.parseObject(JSON.toJSONString(map)).toString() + ")");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

1、世界返回的json格式數據不能是滿足jsonp的數據需求, 需要是用流的形式將數據輸出
2、數據裝配的格式必須是滿足josnp的數據需求

 

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