推荐一个读者做的不错的编程学习网站:

网站:潜安
域名:http://www.qianani.com

另外将会不定期推送近期网站用到的一些技术,讲一些核心原理,今天为第一篇

问题由来:

最近一直在优化两个Python学习网站,自己给自己提点需求,看看能不能实现,比如下方为http://www.python88.cn网站,在这个网站中,我做了一个功能,检测用户是否在该网站扫码并输入验证码,如果扫码验证过,则在后端记录并返回前端打印出来"right",如果没有扫码验证,则返回“error",返回这样标记的目的是为了通过这个标志是否做出右下角的弹窗,如果没有验证的用户,则会弹出右下角的弹窗,当然在这个网站中这点已经很容易实现了

接下来需求就来了,下方是http://www.python66.cn第二个网站,因为我想通过http://python66.cn向http://python88.cn网站引流,点击弹窗能跳转到http://88.cn网站,同样,我也想通过用户能否获取在第一个网站扫码(返回的right或error)来判断是否弹出下方的弹窗,这样则牵涉到跨域请求

什么是跨域请求:

举个例子:假如一个域名为http://aaa.cn的网站,它发起一个资源路径为http://aaa.cn/book/100.html的 Ajax 请求,那么这个请求是同域的,因为资源路径的协议、域名以及端口号与当前域一致(例子中协议名默认为http,端口号默认为80)。但是,如果发起一个资源路径为http://bbb.com/doc的 Ajax 请求,那么这个请求就是跨域请求,因为域不一致,与此同时由于安全问题,这种请求会受到同源策略限制。

ajax只能请求同一个域下的数据或资源,有时候需要跨域请求数据,就需要用到jsonp技术(还有其他方式也可以跨域请求),jsonp可以跨域请求数据,它的原理主要是利用了<script><img>标签具有src属性可以跨域链接资源的特性。jsonp和ajax原理完全不一样,不过jquery将它们封装成同一个函数。

如何理解<script><img>标签具有src属性标签可以跨域链接资源?

比如这是我在csdn的文章,里面的图片引入的是我http://python88.cn的网站图片,就是典型的跨域,包括我们<script>标签,有时候也会通过src引入一些网络上的框架,也是这个道理,jsonp就是通过这样的原理来实现的跨域

原理基于上面原理,但是一般我们在用的时候,通过jQuery封装好的方法来进行使用,下面开始上代码

1、首先我在后端视图中定义一个book_ip_sign2函数,并同步配置url

说明,jsonp跨域请求只能接受get请求,不支持post请求

def book_ip_sign2(request):user_ip = request.META['REMOTE_ADDR']print("***********")print(user_ip)engine = get_local_engine()ip_df = pd.read_sql("find_ip_num", engine)ip_list = list(ip_df["ip"])if user_ip not in ip_list:print("新的用户IP")func = request.GET.get('callback', None)context = {"user_ip": user_ip, "book_click_sign": "error","find_ip_num":num}return HttpResponse("%s(%s)"%(func,context))else:current_user = FindIpNum.objects.filter(ip=user_ip)current_num = current_user[0].numif current_num < 3:func = request.GET.get('callback', None)context = {"user_ip": user_ip, "book_click_sign": "error","find_ip_num":current_num}return HttpResponse("%s(%s)"%(func,context))elif current_num >= 3:func = request.GET.get('callback', None)context = {"user_ip": user_ip, "book_click_sign": "right", "find_ip_num":current_num}return HttpResponse("%s(%s)"%(func,context))

对于上面代码,看着很多,不过你可以忽略那些业务逻辑,只需要看返回的数据即可,我这里主要想返回三个数据(book_click_sign , current_num, user_ip),直接将这几个构造成context通过JsonResponse返回是不行的,前端会报错,后来找了点资料,发现要跟回调函数拼接,也就是下面的,func是回调函数名,通过拼接用HttpResponse进行返回

func = request.GET.get('callback', None)
context = {"user_ip": user_ip, "book_click_sign": "right", "find_ip_num":current_num}
return HttpResponse("%s(%s)"%(func,context))

前端查看该返回结果是这样的,括号中就是我们返回前端的数据,也是回调函数的参数(回调函数名+参数)

jQuery17104493579000703556_1550910515349('error_0_139.227.3.199')

2、前端jsonp请求

前端引入jQuery,通过$.ajax进行请求,注意这里的jsonp和ajax原理完全不一样,这里$.ajax .done .fail此类只是jQuery官方将两种请求封装成了看起来类似的方法

核心请求头就是url,type,dataType这些,如果请求成功,则通过.done写js逻辑,如果请求失败则通过.fail写js逻辑

返回的data: 后端回调函数括号中的参数即返回前端的最终data

error_0_139.227.3.199

$.ajax({url:'http://www.python88.cn/book_ip_sign2/',type:'get',dataType:'jsonp',
})
.done(function(data){book_click_sign = data.book_click_sign;find_ip_num = data.find_ip_num;user_ip = data.user_ip;console.log(user_ip)console.log(find_ip_num)console.log(book_click_sign)if(book_click_sign=="error"){$("#hzw_showmsg").delay(5000).slideDown(1000);}else{console.log("放过一次")}
})

大家如果想测试,可以去http://www.python66.cn前端栏目下载源码,下载后是一个html文件,通过控制台就能看到跨域请求返回的结果

jsonp跨域原理_【网站技术解读①】Javascript实现跨域请求相关推荐

  1. javascript写字技巧_网站建设对JavaScript书写如何更加规范化

    <网站建设对JavaScript书写如何更加规范化>由[张国维博客]于2017年10月23日整理发布! 网站建设注重与html分离, 减小reflow, 注重性能(function).库引 ...

  2. mysql单台跨数据库查询_在MySQL中怎样进行跨库查询?

    在MySQL中跨库查询主要分为两种情况,一种是同服务的跨库查询:另一种是不同服务的跨库查询:它们进行跨库查询是不同的,下面就具体介绍这两种跨库查询. 一.同服务的跨库查询 同服务的跨库查询只需要在关联 ...

  3. cors 前后端分离跨域问题_前后端分离之CORS跨域访问踩坑总结

    前言 前后端分离的开发模式越来越流行,目前绝大多数的公司与项目都采取这种方式来开发,它的好处是前端可以只专注于页面实现,而后端则主要负责接口开发,前后端分工明确,彼此职责分离,不再高度耦合,但是由于这 ...

  4. 模板引擎工作原理_「白皮书解读搜索引擎的工作原理」如何排序

    导读:搜索引擎是如何对网站进行排序的呢?今天解读的是索引. 本文解读的是:<百度官方课程检索排序> 1.检索排序原理 2.影响搜索结果排序的几个因素 一.检索排序原理 搜索引擎工作过程包括 ...

  5. 搜索爬行原理_使用Diffbot爬行和搜索整个域

    搜索爬行原理 In this tutorial, I'll show you how to build a custom SitePoint search engine that far outdoe ...

  6. 将虚拟主机加入到netskills.net域环境_网站建设阿里云虚拟主机、ECS服务器、企业邮箱选择购买指南...

    对于刚接触阿里云的人来说可能看到阿里云的产品介绍页面会比较头晕,各种产品分类,而且同一个产品在不同的分类目录下都能看到,下面简单介绍一下制作网站过程中常用的阿里云的产品. 阿里云在网站建设方面常用的服 ...

  7. 语音识别技术_语音识别原理_语音识别技术原理_企业服务汇

    编者按:对于需要引入语音机器人的企业来说,机器人的语音识别能力是企业需要关注的重点,企业怎么去判断语音机器人的语音识别技术水平?本文从语音识别技术的发展和语音识别能力判断进行介绍. ➤语音识别技术的发 ...

  8. web漏洞扫描器原理_【技术分享】漏洞扫描技巧篇Web 漏洞扫描器

    0x00 前言 之前 我们简单介绍了一下扫描器中爬虫的部分,接下来将继续介绍扫描器中一些我们认为比较有趣的技巧. 0x01 编码/解码/协议 在很久以前有人提问 AMF 格式的请求怎么进行检测,或者有 ...

  9. 产品运营 跨境支付_餐饮网店的运营 跨境支付哪个平台最好

    看你的业务和主营区域,目前信用卡和借记卡都是在线交易中占主流的支付方式.然而内在许多国家,并不是所容有人都喜欢使用信用卡或借记卡在线上消费,原因有很多,也许是因为本身没有信用卡,也许是担忧信息泄露,又 ...

最新文章

  1. PHP函数printf()、sprintf()的用法
  2. 杂七杂八的前端基础01——函数作用域
  3. linux 类似winscp_mac上有什么类似winscp的软件?
  4. 和自己和解:方法的借鉴level
  5. 关于activiti中的三类网关
  6. python中enumerate()的理解
  7. zabbix server的图像展示接口
  8. python中plot不能显示标签_python 2: 解决python中的plot函数的图例legend不能显示中文问题...
  9. java Swing实现考试系统
  10. SQL 后计算的利器 SPL
  11. [硬件技术] 教你如何挑选主板:电脑主板质量好坏的鉴别方法
  12. win10系统个人服务器配置,个人电脑win10配置服务器吗
  13. 微信公众号授权H5页面
  14. svg图片如何引入vue
  15. 泰坦尼克号乘客生存预测
  16. 软件工程北大慕课答案
  17. H5游戏定制开发要点全解析
  18. 与其坐而论道,不如起而行之
  19. 安装RVM时报错 curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
  20. windows phone 智能拼图

热门文章

  1. openstack-neutron基本的网络类型
  2. 如何比较浮点数相等_『GCTT 出品』Go 语言中的比较操作符
  3. Linux下用 lsof 命令查找指定端口被哪个进程占用
  4. DuiLib——xml节点元素属性介绍
  5. java400状态,java – HttpURLConnection:如何读取400响应的有效负载
  6. golang mysql 事务_golang的嵌套事务管理-Go语言中文社区
  7. android .a .so区别,.so,.la和.a库文件有什么区别?
  8. Zookeeper一致性级别分析,面试题附答案
  9. 【PAT (Advanced Level) Practice】1120 Friend Numbers (20 分)
  10. 【机器学习入门到精通系列】粒子群优化算法