跨域的几种解决方案(详细)

article/2025/9/20 6:54:42

跨域的几种解决方案

    • 1.什么是跨域
    • 2.演示用axios请求网易新闻地址,发现跨域出错
    • 3.解决跨域方式
      • 3.1 jsonp方式
      • 3.2 cors方式
      • 3.3 proxy代理转发

1.什么是跨域

.网页所在url的协议、域名、端口号,和Ajax请求url的协议、域名、端口号有一个对应不上,就发生跨域
.跨域是浏览器对ajax做出的限制

2.演示用axios请求网易新闻地址,发现跨域出错

http://c.m.163.com/nc/article/headline/T1348647853363/0-40.html

3.解决跨域方式

3.1 jsonp方式

.需要前端和后端同时支持
前端

  <script>//为后端返回的函数做准备,否则会报错显示abc is not a functionfunction abc(res){console.log(res)}</script>//利用html标签的src属性不受跨域限制,从而进行跨域访问<script src="http://localhost:3000/api/jsonp"></script>

后端

const express=require('express')
const app=express()
//测试jsonp请求接口
app.get('/api/jsonp',(req,res)=>{
//发送的内容会被解析为js代码,其中abc就是函数(传参传的是对象)
//前端需要准备abc函数以及形参。res.send('abc({status:0,message:"登录成功"})')
})
app.listen(3000,()=>console.log('启动了'))

前端用script+src属性, 发送函数名给后台, 同时准备好同名的函数, 准备接收数据
后端返回的字符串一定用方法名(数据字符串)格式返回, 到script标签中执行
调用函数名, 并传递数据

具体实现

<script>function callBackFn(data){// data就是'{"a": 10, "b": 20}'}
</script>
<script src="http://后台接口地址?callback=callBackFn"></script>
<!-- 后台接口返回 'callBackFn({"a": 10, "b": 20})' -->

3.2 cors方式

.前端什么也不用做
.后端需要开启cors

前端

let xhr=new XMLHttpRequest()
xhr.onload=function(){console.log(xhr.responseText)
}
xhr.open('get','http://localhost:3000/api/test')
xhr.send()

后端
index.js

const express=require('express')
const app=express()
//测试接口
app.get('/api/test',(req,res)=>{//指示允许哪些源发送请求,*表示所有res.setHeader('Access-Control-Allow-Origin','*')res.send('hello word')
})
app.listen(3000,()=>console.log('启动了'))
  • 实际上就是在响应头添加允许跨域的源
  • Access-Control-Allow-Origin: 字段和值(意思就是允许去哪些源地址去请求这个服务器)如 get 、post 、put 、delete…
  • CORS才是解决跨域的真正解决方案。
  • 前端需要做什么?
    无需做任何事情,正常发送Ajax请求即可。
  • 后端需要做什么?
    需要加响应头 。或者使用第三方模块 cors 。

3.3 proxy代理转发

.如果后端jsonp也不弄,cors也不弄,就给个接口地址

我们可以在本地弄个服务器, 然后用服务器请求后台服务器接口地址

在这里插入图片描述
.但是vuecli脚手架, 启动了一个webpack开发服务器, 它就能做代理转发(后端和后端不存在跨域问题)
.而且前端和这个服务器是同源的都是8080端口
.需要修改webpack开发服务器的配置即可

更多配置项参考这里:https://webpack.docschina.org/configuration/dev-server/#devserverproxy

devServer: {proxy: {// http://c.m.163.com/nc/article/headline/T1348647853363/0-40.html'/api': { // 请求相对路径以/api开头的, 才会走这里的配置target: 'http://c.m.163.com', // 后台接口域名changeOrigin: true, // 改变请求来源(欺骗后台你的请求是从http://c.m.163.com)pathRewrite: {'^/api': '' // 因为真实路径中并没有/api这段, 所以要去掉这段才能拼接正确地址转发请求}}}}

.axios请求的代码

axios({url: '/api/nc/article/headline/T1348647853363/0-40.html'
})

http://chatgpt.dhexx.cn/article/tuj9vbqu.shtml

相关文章

跨域9大解决方案(超详细) 总结

前面的话 我们经常听到跨域这词&#xff0c;这是由于浏览器同源策略限制的一类请求场景。这样做的目的使得 浏览器不容易受到攻击。 推荐文章&#xff1a;九种跨域方式实现原理&#xff08;完整版&#xff09; 什么是同源策略&#xff1f; 同源策略&#xff08;Same origin…

前端跨域解决方案

文章目录 注意&#xff0c;本文已迁移 1.同源政策2.跨域解决方案2.1 CORS普通跨域请求&#xff1a;只需服务端设置Access-Control-Allow-Origin即可携带cookie跨域请求&#xff1a;前后端都需设置 2.2 postMessage跨域2.3 JSONP原理缺点数据格式jsonp跨域实现 2.4 WebSocket属性…

解决跨域的三种方案

解决跨域的三种方案 到目前为止&#xff0c;我们编写的 GET 和 POST 接口&#xff0c;存在一个很严重的问题&#xff1a;不支持跨域请求 解决接口跨域问题的方案主要有三种 CORS (主流的解决方案&#xff0c;推荐使用) 代理 (推荐使用) JSONP (有缺陷的解决方案&#xff1a…

跨域的五种解决方案详解

1.跨域解决方案一:cors技术 CORS :全称cross origin resource share &#xff08;资源共享&#xff09; 工作原理&#xff1a; 服务器 在返回响应报文的时候&#xff0c;在响应头中 设置一个允许的header res.setHeader(‘Access-Control-Allow-Origin’, ‘*’) CORS :全称…

Java中parseInt用法(double类似)

1.将字符直接解析为十进制数进行输出 2.如果方法有两个参数&#xff0c; 使用第二个参数指定的基数&#xff0c;将字符串参数解析为有符号的10进制整数。&#xff08;所谓指定基数&#xff1a;就是将字符串指定为2&#xff0c;8&#xff0c;16等进制数&#xff0c;然后用解析为…

javascript:parseInt用法,特殊用法,进制转换

parseInt( string,radix ) 一、功能&#xff1a; 除了我们众所周知的字符串转换为整数以外&#xff0c;还涉及到进制问题&#xff1a; 将 [ 指定进制的 ] 字符串转换为十进制整数型 用汉语翻一下这个方法&#xff1a; 二、参数&#xff1a; 1、string: 要解析的字符串&a…

前端JS字符串转数值 Number和parseInt用法

Number() 只包含数值的字符串字符串为空则为0 parseInt() 字符串不能为空字符串第一个必须为数值从第一个数值开始取&#xff0c;到最后一个连续数值结束

java中Integer.parseInt用法详细分析(全)

目录 前言函数讲解 前言 将数字字符串转化成原生整型数据 属于java.lang.Integer 是原生类型整型的包裹类 函数讲解 1.parseInt(String s) 将字符串s转换为十进制的数字&#xff0c;默认为十进制 public static void main(String[] args) {int numInteger.parseInt("10…

parseInt用法

MDN: 从给定的字符串中解析出的一个整数。 代码&#xff1a; <script>var aparseInt("100px");console.log("a:"a" type:"typeof(a));</script>效果&#xff1a;

parseInt鲜为人知的用法

用法一&#xff1a;将小数转换成整数 var float_num 3.14;float_num parseInt(float_num);console.log(float_num);输出结果&#xff1a; 用法二&#xff1a;以数字开头的字符变量转换成整数 var str_num 3.14string;str_num parseInt(str_num);console.log(str_num);输出…

javax.servlet.http.HttpServletRequest错误

javax.servlet.http.HttpServletRequest错误 javax这个api出错 问题分析&#xff1a;javax.api找不到。 解决方案&#xff1a; 方案一&#xff1a; 可以再maven的pom.xml文件中导入方案二&#xff1a; idea没有导入tomcat下的lib目录下的api,我们手动导入就可以。 步骤如下&a…

java: 程序包javax.validation不存在

之前&#xff0c;有位同学反馈说&#xff0c;在运行newbee-mall-api项目时遇到了下面这个问题&#xff0c;无法正常编译项目&#xff0c;错误截图如下&#xff1a; 看了一下应该是NotEmpty、Valid这几个验证注解引起的&#xff0c;因为这几个注解都是定义在javax.validation包…

maven install 时提示程序包javax.crypto不存在

maven install 时提示程序包javax.crypto不存在 大家好&#xff0c;我是酷酷的韩~ 一.maven install报错原因 javax.crypto是在jdk的jre\lib目录下的,需要在编译的时候引入jdk的rt.jar包和jce.jar包。 二.解决办法 <build><plugins><plugin><groupId&…

javax.crypto.AEADBadTagException: Tag mismatch 的解决办法

问题概述 关于这个问题&#xff0c;博主是在微信支付开发与配置过程中遇到的&#xff0c;在使用工具 “ CertificateDownloader-1.1.jar ” 生成平台证书时&#xff0c;报&#xff1a;“ javax.crypto.AEADBadTagException: Tag mismatch! ” ,提示标签不匹配&#xff0c; 如下…

java javax.servlet_java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream 报错解决

报错的方法栈 在ssm中写了一个 utils 类&#xff0c;定义了main方法测试和查看工具实际数据 运行main方法时报错了&#xff0c;之前都没错&#xff0c;莫名其妙报了错 java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream at java.lang.Class.getDeclaredMetho…

javax 和hibernate 的NotBlank

问题&#xff1a;hibernate版本在5 的时候&#xff0c;如果你用了 import javax.validation.constraints.NotBlank; 在校验的时会报错 HV000030: No validator could be found for constraint javax.validation.constraints.NotBlank validating type java.lang.String. Chec…

java和javax的区别

java与javax的区别分析 Java是一种受C语言影响的编程语言。Java和Javax本质上是与Java编程语言的上下文一起使用的包。实际上Java和Javax没有区别。这只是不同的名字。Java是一种编程语言&#xff0c;受到C语言的影响。它源自C和C的大部分语法&#xff0c;但是它的低级别设施比…

使用 javax.mail 发送邮件

发邮件在 java web 项目中是一个常用功能&#xff0c;之前在项目中刚好用到了邮件发送功能&#xff0c;现在用博客进行记录&#xff0c;方便以后查阅。这篇文章简单介绍使用 javax.mail 发送邮件的步骤&#xff0c;并提供封装好的邮件发送方法&#xff0c;希望对自己和别人有用…

javax.validation校验整理

文章目录 前言一、非空校验二、长度校验三、数值校验四、正则校验五、自定义校验注解六、校验组 前言 javax.validation校验总是混淆&#xff0c;特此整理。如有错误&#xff0c;请不吝指正。 一、非空校验 序号注解解释适用场景1NotNull不能为null&#xff0c;但可以为empt…

Java API学习(二)javax包

在线中文api&#xff1a;http://tool.oschina.net/apidocs/apidoc?apijdk-zh Java版本&#xff1a;1.8 Android版本&#xff1a;23 java的api有java和javax2个包 java和javax都是Java的API包&#xff0c;java是核心包&#xff0c;javax的x是extension的意思&#xff0c;也就…