当前位置:网站首页>解决跨域问题的方法 --- JSONP
解决跨域问题的方法 --- JSONP
2022-08-02 14:17:00 【z_小张同学】
JOSNP全称json with padding,可以让网页从别的域名(网站)那获取资料,即跨域读取数据。
在前端中可以跨域的标签有以下几种:
<img src="" alt="">
<script src=""></script>
<a href=""></a>
<link href="">router.js代码:
var fs=require("fs")
var url=require("url")
var querysting=require("querystring")
var mime=require("mime")
let urls={}
var http=require("http")
let router=function(req,res){
//这个函数每次用户访问时运行
let pathname=url.parse(req.url).pathname
fs.readFile(router.basepath+pathname,(err,data)=>{
if(!err){
res.setHeader("content-Type",mime.getType(pathname))
res.end(data)
}else{
if(!urls[pathname]){res.end("404 not found-mymvc")}
else{urls[pathname](req,res)}
}
})
}
router.static=function(path){
this.basepath=path
}
router.get=function(url,cb){
urls[url]=cb
}
router.basepath=__dirname+"/public"
http.createServer(router).listen(8081)
module.exports=router;服务器端的index.js代码:
var router = require("./router.js")
var url = require("url")
var querysting = require("querystring")
router.get("/ajax",function(req,res) {
var obj = {name:"xiaozhang",age:21,books:["book1","book2"]}
var str = JSON.stringify(obj)
var query1 = url.parse(req.url).query
var queryobj = querysting.parse(query1)
res.end(`${queryobj.callback}(${str})`)
})客户端index.html代码:
<button onclick="fn()">JSONP请求</button>
<script>
function fn() {
var name = "hq"+new Date().getTime()
window[name] = function(arg) {
console.log(arg);
}
var script1 = document.createElement("script")
script1.src = `http://192.168.0.114:8081/ajax?callback=${name}`
document.body.append(script1)
}
</script>点击按钮之后的结果:

对JSONP的理解:
1.前端网页中用ajax请求跨域服务器的网址 会报跨域错误;而用script标签的src属性去请求跨域服务器的网址, 不会报跨域错误,但是 会直接把请求过来的编码用v8引擎去运行
2. 我们可以在后端写一个js引擎能识别的字符串发送给前端,这个字符串是这样的:
' fn({"name":"karen"}) ' ;前端可以用script标签的src属性去请求这个网址,请求完毕以后 v8引擎就会直接运行这个编码 去调用fn函数,所以我们必须提前创建这个函数
3.函数的名称问题: 前端可以通过querystring把函数名以参数的形式发送给后端
边栏推荐
- RTMP, RTSP, SRT 推流和拉流那些事
- 【交换机端口安全技术 】
- 网络运维系列:二级域名启用与配置
- Oauth2.0 安全性(以微信授权登陆为例)
- Feign Client 超时时间配置不生效
- smart_rtmpd 的 NAT 映射方式使用说明
- LAMP 环境搭建 yum源安装方式 (Apache 2.4.6 +mysql 8.0.28+php 8.1.3)
- Dcoker的安装及使用命令
- Oauth2.0 security (take WeChat authorized login as an example)
- The use of a semaphore/interprocess communication 】 【 Shared memory
猜你喜欢
随机推荐
appium 报错:AttributeError:
Dcoker的安装及使用命令
smart_rtmpd 轻松突破 C100K 测试
转行软件测试,从零收入到月薪过万,人生迎来新转折
unittest框架
关于机组的部分知识点随笔
CDH (computational Diffie-Hellman) problem and its differences with discrete logarithm and DDH problems
Vert.x web 接收请求时反序列化对象 Failed to decode 如何解决?
Oauth2.0 security (take WeChat authorized login as an example)
APP版本更新通知流程测试要点
screen 不间断会话服务
打包项目上传到PyPI
个人成长系列:业务、技术学习书单
Oauth2.0 自定义响应值以及异常处理
Oauth2.0 resource server construction
OpenPose run command ([email protected])
记一次 ThreadLocal 泄漏导致的 shardingsphere-jdbc-core 单元测试偶发失败的排查与修复
WEB自动化之多窗口操作、切换frame、弹窗处理
Mysql索引优化二
【网络安全】学习笔记 --00









