ajax跨域问题解决

为何会出现跨域

  • 跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则容许相互访问。也就是说JavaScript只能访问和操做本身域下的资源,不能访问和操做其余域下的资源。跨域问题是针对JS和ajax的,html自己没有跨域问题,好比a标签、script标签、甚至form标签(能够直接跨域发送数据并接收数据)等 

如何解决跨域问题

  • JSONP 
      JSONP是JSON with Padding的略称。它是一个非官方的协议,它容许在服务器端集成Script tags返回至客户端,经过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。关于jsonp的使用方式,能够参考http://blog.csdn.net/alen1985/article/details/6365394,优缺点能够参考http://blog.csdn.net/z69183787/article/details/19191385  
  • 添加响应头,容许跨域 
      addHeader(‘Access-Control-Allow-Origin:*’);//容许全部来源访问 
      addHeader(‘Access-Control-Allow-Method:POST,GET’);//容许访问的方式
  • 代理的方式 
    服务器A的test01.html页面想访问服务器B的后台action,返回“test”字符串,此时就出现跨域请求,浏览器控制台会出现报错提示,因为跨域是浏览器的同源策略形成的,对于服务器后台不存在该问题,能够在服务器A中添加一个代理action,在该action中完成对服务器B中action数据的请求,而后在返回到test01.html页面。

Demo1(添加容许跨域请求的响应头)

  • html页面 
    javascript

  • Web后台 
     
     
    按照上面的访问,因为127.0.0.1:8080和localhost:8081的域和端口不一样,因此一样会出现跨域问题。 
    html

如今用添加响应头的方式 

java


Demo2(jsonp的callback方式)

这里演示的是jquery的ajax,后台采用的是webservice接口形式 

注意此时的dataType为jsonp格式,看看后台的接收 
, 
咱们返回的其实就是一个函数的调用文本,这里注意,callback的名称,因为前台没有指定callback函数,因此这里自动生成了,若是想自定义回调函数名称以下操做,添加一行请求参数 

这样后台的回调函数名就变成了mytest 

浏览器发出的请求格式和响应数据以下,其实就是返回函数的调用,而须要返回的数据则以函数参数值的形式填入 
 
此时控制台就可以获取到“hello world” 
jquery

推荐参考资料: 
http://www.cnblogs.com/chopper/archive/2012/03/24/2403945.htmlweb

转载:ajax

http://www.javashuo.com/article/p-ubsnyhoo-y.htmljson