您好,登錄后才能下訂單哦!
今天遇到的問題是如題,簡單說就是ajax的跨域問題;首先問題是這樣出現的,在容器(tomcat6)之外(桌面上)新建了個測試html--test.html,調用在容器中的項目xxx中的方法,所有流程代碼都沒有問題,方法中返回的是json格式字符串,返回方式也是json像這樣:
<result name="success" type="json">
<param name="root">json</param>
</result>
頁面代碼:
$.get("http://localhost:8080/xxx/queryInfo.action?id=111",
function(data){
alert(data.name)
},"json")
使用FF的firebug調試發現test.html的請求已經通過,服務器狀態200,延時40ms,但是整個請求是紅色的代表錯誤;之后把test.html中的請求URL粘貼到地址欄,發現一切正常,之后糾結中....
使用chrome的控制臺調試發現:
XMLHttpRequest cannot load http://localhost:8080/xxx/queryInfo.action?id=111 .No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
度娘之后發現是跨域的問題,
參考http://www.cnblogs.com/chopper/archive/2012/03/24/2403945.html 后將代碼改為
$.get("http://localhost:8080/xxx/queryInfo.action?id=111&callback=?",
function(data){
alert(data.name)
},"jsonp")
之后調試發現報Uncaught SyntaxError: Unexpected token : 這個錯誤,打開錯誤代碼發現返回的json格式錯誤,原因是在請求headers里加了這么2段
然后就解析不了第二個":",所以就報錯Unexpected token :
繼續度娘之后發現是對于jsonp來說有特殊格式需要改,
參考http://kb.cnblogs.com/page/139725/ 后發現是需要改變返回值的封裝,但是沒有現成的json轉jsonp的工具,技術,封裝類(比如string轉json之類的工具),需要手動寫,果斷放棄繼續調試...
繼續度娘無意間發現這個帖子
http://blog.csdn.net/z69183787/article/details/45896577 將struts.xml文件中返回值加一條
<param name="callbackParameter">callback</param>
完美解決~
至此困擾2個多小時的問題解決,特此記錄
PS:jquery 中對于jsonp的封裝,對get類型請求支持比較好,建議用GET方法請求,最好不要用POST
又PS:還有一種暴力跨域方法,貌似只支持chrome和安卓系統,
參考http://camnpr.com/archives/chrome-args-disable-web-security.html ,方法就是使用--disable-web-security 這個參數強行中止跨域安全檢查,最后結果是一樣的,但是安全性嘛,知乎用戶很好的解答了這個問題http://www.zhihu.com/question/27817605
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。