Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 1004|回复: 0

HTML5中Access-Control-Allow-Origin解决跨域问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-16 15:25:29 | 显示全部楼层 |阅读模式

    跨域在开发中一些是一个比较常见的问题虽然有json或者xml来解决,现在html5开始流行了,我们可以通过Access-Control-Allow-Origin解决跨域问题,下面一起来看看。

     

    A.abc.com 发起一个到 abc.com/B 的ajax请求,也会有跨域的问题。之所以会有跨域问题,实则是因为www.abc.com其实同A.abc.com一样,也是一个二级域名,而非一级域名(一级域名是http://abc.com)

    对于是否允许跨域,更详细的说明可以看下表:

     

     

    URL 说明 是否允许通信

    http://www.a.com/a.js

    http://www.a.com/b.js

    同一域名下 允许

    http://www.a.com/lab/a.js

    http://www.a.com/script/b.js

    同一域名下不同文件夹 允许

    http://www.a.com:8000/a.js

    http://www.a.com/b.js

    同一域名,不同端口 不允许

    http://www.a.com/a.js

    https://www.a.com/b.js

    同一域名,不同协议 不允许

    http://www.a.com/a.js

    http://170.32.82.74/b.js

    域名和域名对应ip 不允许

    http://www.a.com/a.js

    http://script.a.com/b.js

    同一域名,不同二级域名 不允许

    http://www.a.com/a.js

    http://a.com/b.js

    二级域名和一级域名 不允许(cookie这种情况下也不允许访问)

    http://www.b.com/a.js

    http://www.a.com/b.js

    不同域名  

     

    有了对跨域的基本概念了解后,就可直接进入这篇文章的主题了。

    赞助商链接
    解决方法:

    若在接收请求的服务端abc.com/B页面用的是php语言,则在页面中加入:

    // 指定可信任的域名来接收响应信息,推荐
    <?php  header('Access-Control-Allow-Origin:http://A.abc.com'); ?>
    或加入

    // 使用通配符 * ,表示当前服务端通话任何域名发起请求,不推荐
    <?php header('Access-Control-Allow-Origin:*'); ?>
    就这样在服务端简单加一句响应头responese headers声明,一个跨域请求就不会被浏览器的同源安全策略所阻止了!

    用chrome调试工具Network ajax请求查看面板中可以看到,类似如下截图:cors

    需要注意的是:

    添加响应头responese headers时,允许跨域请求的域名带不带斜杠/还是有区别的,带斜杠/会报错:
    XMLHttpRequest cannot load  abc.com/B. The 'Access-Control-Allow-Origin' header has a value 'http://A.abc.org/' that is not equal to the supplied origin. Origin 'http://A.abc.org' is therefore not allowed access.

    header('Access-Control-Allow-Origin:*');是html5新增的一项标准功能,因此 IE10以下 版本的浏览器是不支持 的,因此,如果要求兼容IE9或更低版本的ie浏览器,会导致使用此种方式的跨域请求以及传递Cookie的计划夭折,最终还得回归JSONP(目前主流的处理方式是使用JSONP,易于实现,兼容性好,可查的资料也很多。)

    跨域解决后,如果还要操作Cookie,还得继续补增响应头:

    <?php  header('Access-Control-Allow-Credentials:true'); ?>
    需要将 XMLHttpRequest 对象的 withCredentials 属性设置为 true,JQuery1.5.1+ 就开始提供了相应的字段,使用方式如下:

    $.ajax({
    url:"B.abc.com",
    xhrFields:{
    withCredentials:true
    },
    crossDomain:true
    });
    哦也~ 收到 Cookie 了。

    设置 withCredentials 为 true 的请求中会包含 A.abc.com端的所有Cookie,这些Cookie仍然遵循同源策略,所以,你只能访问其中和 abc.com/B同根域的Cookie,而无法访问其他域的Cookie。

    Access-Control-Allow-Origin实则是html5 Cross-Origin Resource Sharing实现的最重要的一点参数配置。
    Cross-Origin Resource Sharing,跨域资源共享,简称 CORS,可以作为一种跨域请求以及响应的解决方案。


    附:

    禁用chrome本地安全策略,不用配服务器环境也能发起ajax请求:
    chrome 桌面快捷键 右键属性 在快捷方式标签下的“目标”框中加入 --disable-web-security,重启浏览器即可

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-24 16:47 , Processed in 0.056445 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表