总结自JAVA,这里改成了Python。

什么是AJAX跨域

只要协议、域名、端口有任何一个不同,都被当作是不同的域,不同域之间的请求就是跨域操作。AJAX跨域就是AJAX在A域下对B域发送了请求,一般情况下会被浏览器禁止。

例如,后台开启两个Flask服务器ServerA(port=8080)和ServerB(port=8081):

ServerA.py代码如下:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')

def index():

return render_template('index.html')

@app.route('/get')

def get():

return 'get8080 ok'

if __name__ == "__main__":

app.run(port=8080)

ServerB.py代码如下:

from flask import Flask

app = Flask(__name__)

@app.route('/get')

def get():

return 'get8081 ok'

if __name__ == "__main__":

app.run(port=8081)

index.html使用jQuery发送ajax请求,代码如下:

Index

Test

GET 8080

GET 8081

function get1(){

$.get("http://127.0.0.1:8080/get").then(

function(res){

console.log(res);

})

}

function get2(){

$.get("http://127.0.0.1:8081/get").then(

function(res){

console.log(res);

})

}

因此GET 8080和GET 8081两个按钮是分别向8080/8081端口发送请求,并将结果打印在控制台。开启两个服务器,在浏览器输入127.0.0.1:8080进入index页面,打开Chrome控制台并依次点击,结果如图:

可以看到GET 8080正常输出,而由于8081端口的请求属于跨域,浏览器报错并未正常打印结果。

如何处理AJAX跨域问题

1.关闭浏览器安全策略

禁止跨域的AJAX请求,是浏览器本身的安全策略,实际上后台并没有限制,例如点击GET 8081后,可以在NETWORK中看到这个请求本身是OK的:

因此只要关闭浏览器的安全策略即可,方式之一是在命令行中使用

"chrome.exe路径" --disable-web-security --user-data-dir=D:\temp

打开浏览器,此时浏览器会有安全性提示,依次点击两个按钮,结果如图:

2.使用JSONP

AJAX请求受到跨域的限制,其请求类型是xhr,但html页面在引用别的域的JS脚本时却可以正常访问,这种请求的类型是script,如图:

JSONP的原理就是将原本的xhr请求替换为script请求,例如假设原先xhr请求返回的是数据A,JSONP请求会附带一个callback参数说明本地使用的回调函数,假设为func1,后端收到这个JSONP请求,返回的是JS代码func1(A)。使用JSONP需要对前后端都做修改。在此不演示~

3.在ServerA中修改

我们可以让后台服务器代替浏览器去请求跨域的接口,并将数据通过本域的接口返回给浏览器,使浏览器不再发送跨域请求。例如在ServerA.py中增加一个接口如下:

@app.route('/get_8081_through_8080')

def get2():

return requests.get('http://127.0.0.1:8081/get').text

index.html增加一个button,如下:

GET 8081 THROUGH 8080

function get1(){

...

}

function get2(){

...

}

function get3(){

$.get("http://127.0.0.1:8080/get_8081_through_8080").then(

function(res){

console.log(res);

})

}

此时对浏览器而言get3()就不属于跨域的请求了,后台代替浏览器向8081发送了请求。

结果如图所示,第二个button由于跨域仍然报错,第三个button则正常输出:

4.在ServerB中修改

ServerB也可以通过向浏览器返回特定响应头,告诉浏览器它是允许被跨域调用的,使用flask的make_response添加Access-Control-Allow-Origin和Access-Control-Allow-Methods两个字段,ServerB.py更新如下:

from flask import Flask, Response

app = Flask(__name__)

@app.route('/get')

def get():

return 'get8081 ok'

@app.route('/get2')

def get2():

resp = Response('get8081 ok by Access-Control-Allow')

resp.headers['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8080'

resp.headers['Access-Control-Allow-Methods'] = 'GET'

return resp

if __name__ == "__main__":

app.run(port=8081)

将index.html的get2()方法请求的接口改为'http://127.0.0.1:8081/get2',依次点击button,第二个button已经可以正常输出内容:

python爬虫跨域_AJAX跨域简单讲解【Python版】相关推荐

  1. python爬虫入门教程(非常详细),超级简单的Python爬虫教程

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  2. python爬虫办公实例100例_简单的python爬虫实例

    爬取搜索出来的所有"中东人"的图片: 先看一下源代码,找到存放图片链接的地方,在源代码最下面的部分: 先说一下思路: 构造url列表=>依次爬取每个页面=>先在网页源代 ...

  3. python中输入字符串_简单讲解Python中的字符串与字符串的输入输出

    简单讲解Python中的字符串与字符串的输入输出 发布于 2016-03-26 14:35:42 | 110 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向 ...

  4. 从入门到入土:Python爬虫学习|Selenium自动化模块学习|简单入门|轻松上手|自动操作浏览器进行处理|chrome|PART01

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  5. 零基础学习python爬虫_教你零基础如何入门Python爬虫!

    Python爬虫好学吗?看你怎么学了.如果是自学,会难一些,毕竟有难题很难找到人帮你解答,很容易半途而废.要是你找到了一家靠谱的学校,就会容易很多.不过,这里我想教你入门Python爬虫. 一:爬虫准 ...

  6. python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...

    原标题:不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据 Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫.学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方 ...

  7. 零基础学python爬虫-我是如何零基础开始能写Python爬虫的

    刚开始接触爬虫的时候,简直惊为天人,十几行代码,就可以将无数网页的信息全部获取下来,自动选取网页元素,自动整理成结构化的文件. 利用这些数据,可以做很多领域的分析.市场调研,获得很多有价值的信息.这种 ...

  8. python爬虫框架排行榜-8个最高效的Python爬虫框架,你用过几个?

    小编收集了一些较为高效的Python爬虫框架.分享给大家. 1.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系 ...

  9. Python爬虫实战——签名软件设计(一)python POST模拟网页按钮点击

    Python爬虫实战(windows) 关于本文: 上一篇文章介绍了如何使用python爬虫进行网页图片等素材的抓取.我们以爬虫抓取作为基础,结合GUI设计,再通过自定义方法,就可以实现一些小软件的设 ...

最新文章

  1. 测试驱动开发与行为驱动开发中的测试先行方法
  2. 华为笔记本matebook13_为什么我不推荐华为Matebook 13给职场新人/小白?
  3. Python 3.3.2中文版
  4. SDL 播放pcm数据
  5. 【免费下载】2021年7月热门报告盘点(附热门报告列表及下载链接)
  6. vivado下block design重新整理布局regenerate layout
  7. java 打印标签_用Java打印到标签打印机
  8. jimu Mirror,加速你的 Android UI 开发
  9. percona-tool文档说明(4)- 监控类
  10. 使用el-dialog时,报错“Unknown custom element:<el-dialog> did you register the component correctly?...make
  11. HEALER: Relation Learning Guided Kernel Fuzzing学习笔记
  12. 三种方法寻找数组前K个最大的数
  13. 《听什么歌都像是在唱自己》——网易云音乐那些热评
  14. html5 表格文档常用指令
  15. 基于图注意力神经网络的多智能体博弈抽象
  16. 卓望科技的无线数据MISC平台
  17. [BC#89B]Fxx and game
  18. ❤ 报`Uncaught (in promise)`错误解决办法
  19. www.mdpi.com打不开[解决方案]
  20. 【产业互联网周报】腾讯阿里加速车联网进程;百度智能云提出人工智能工业化概念;2019世界人工智能大会召开...

热门文章

  1. CSS控制鼠标的箭头
  2. java 反射获取属性名和值_阿里P8架构师核心知识点整理:Java基础+spring原理+微服务+算法...
  3. 多问问自己想成为什么样的人
  4. hibernate的type类型对照表
  5. python模拟手写_python-自己手写的贴吧爬虫
  6. 计算机网络(一)计算机网络概述、组成、功能分类、性能指标 | 思维导图
  7. 从 WordCount 到文档的倒排索引详解
  8. Android实现程序之间的跳转
  9. Elasticsearch之Query DSL语法入门
  10. GDB调试基础操作详解【GDB调试】