今天遇到的问题是如题,简单说就是ajax的跨域问题;首先问题是这样出现的,在容器(tomcat6)之外(桌面上)新建了个测试html--test.html,调用在容器中的项目xxx中的方法,所有流程代码都没有问题,方法中返回的是json格式字符串,返回方式也是json像这样:
json
页面代码:
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.
度娘之后发现是跨域的问题,
function(data){
alert(data.name)
},"jsonp")
之后调试发现报Uncaught SyntaxError: Unexpected token : 这个错误,打开错误代码发现返回的json格式错误,原因是在请求headers里加了这么2段callback:jQuery110209291235436685383_1437019561773
_:1437019561774
然后就解析不了第二个":",所以就报错Unexpected token :
继续度娘之后发现是对于jsonp来说有特殊格式需要改,
参考http://kb.cnblogs.com/page/139725/ 后发现是需要改变返回值的封装,但是没有现成的json转jsonp的工具,技术,封装类(比如string转json之类的工具),需要手动写,果断放弃继续调试...
继续度娘无意间发现这个帖子
http://blog.csdn.net/z69183787/article/details/45896577 将struts.xml文件中返回值加一条
callback
完美解决~
至此困扰2个多小时的问题解决,特此记录
PS:jquery 中对于jsonp的封装,对get类型请求支持比较好,建议用GET方法请求,最好不要用POST
又PS:还有一种暴力跨域方法,貌似只支持chrome和安卓系统,