2025年前端跨域产生的原因和解决方法(前端解决跨域的几种办法)

前端跨域产生的原因和解决方法(前端解决跨域的几种办法)文章目录 同源策略与跨域解决 1 同源策略概念 案例 2 解决跨域问题 2 1 方法一 jsonp 解决跨域问题 原生 html 实现 jquery 实现 vue 实现 2 2 方法二 设置 CORS 响应头实现跨域 同源策略 Same Origin Policy 最早由 NEtscape 公司提出 是浏览器的一种安全策略 同源指的是协议 域名 端口号必须完成相同 违背同源策略就是跨域 案例

大家好,我是讯享网,很高兴认识大家。



文章目录

  • 同源策略与跨域解决
  • 1、同源策略概念
  • 案例
  • 2、解决跨域问题
  • 2.1 方法一:jsonp解决跨域问题
  • 原生html实现
  • jquery实现
  • vue实现
  • 2.2 方法二:设置CORS响应头实现跨域

同源策略(Same-Origin Policy)最早由NEtscape公司提出,是浏览器的一种安全策略。同源指的是协议、域名、端口号必须完成相同违背同源策略就是跨域

案例

  • server.js
  • 页面文件index.html

浏览器输入,得到如下结果

express session跨域后取不到值_前端
讯享网

express session跨域后取不到值_ajax_02

2.1 方法一:jsonp解决跨域问题

  • jsonp是什么
    jsonp(JSON with Padding),是一个非官方的跨域解决方法,纯粹凭借程序员的聪明才智开发处理,只支持get请求

  • jsonp工作原理
    在网页有一些标签自带跨域能力,例如img、link、iframe、script
    JSONP就是利用script标签的跨域能力来发送请求的。




原生html实现

例如:

案例一:

  • 测试用html文件

<!DOCTYPE html><html lang=“en”> <head>

<meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="result"></div> <!--跨域请求--> <!--vscode中使用liveserver打开网页时,端口号为5050,所以下面的script标签中确实跨域了--> <script src="http://127.0.0.1:8000/jsonp-test"></script> 

讯享网

</body> </html>

  • server.js文件【使用express框架模仿的服务器】

const express = require(‘express’)const app = express()

app.get(‘/jsonp-test’,(request,response) => {

讯享网// 响应一个字符串 response.send('hello jsonp') 

})

app.listen(‘8000’,()=>{

console.log("服务启动,监听端口中..."); })</p><p>得到的结果报错,意思为不被期待的标识符,说的是script标签不能识别普通字符串</p><p style="text-align:center;"><img src='https://s2.51cto.com/images/blog//_670b3b54af19f184.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184' alt='express session跨域后取不到值_json_03' title="在这里插入图片描述" style="width: 550px; visibility: visible;"></p><p><br></p><p> 因为响应到页面的是一个字符串,而一个script标签是不能解析字符串的,而需要响应一个js代码,因此,server.js需要响应一个js代码的字符串</p><p>const app = express()app.get('/jsonp-test',(request,response) =&gt; { // const data = { // name:"小刘" // } response.send('console.log("hello jsonp")') // response.send(`handle(${data})`) 

})

app.listen(‘8000’,()=&gt;{

讯享网console.log("服务启动,监听端口中..."); 

})

成功获取结果

express session跨域后取不到值_javascript_04

打开浏览器网络,可以看到成功获取响应了,并且响应式js代码

express session跨域后取不到值_前端_05

案例二:

  • server.js

const express = require(‘express’)const app = express()

app.get(‘/jsonp-test’,(request,response) =&gt; {

const data = { name:"小刘" } // 将data转换为json字符串形式 const str = JSON.stringify(data) // 利用模板字符串,将调用方法以js代码的格式响应过去 response.send(`handle(${str})`) 

})

app.listen(‘8000’,()=&gt;{

讯享网console.log("服务启动,监听端口中..."); 

})

  • test.html

&lt;!DOCTYPE html&gt;&lt;html lang=“en”&gt; &lt;head&gt;

&lt;meta charset="UTF-8"&gt; &lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt; &lt;title&gt;Document&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;div id="result"&gt; &lt;/div&gt; &lt;script&gt; // 将方法声明在这,而方法调用通过script标签跨域传进来 function handle(data){ const result = document.getElementById('result') result.innerHTML = data.name } &lt;/script&gt; &lt;!-- 实现跨域 --&gt; &lt;script src="http://127.0.0.1:8000/jsonp-test"&gt;&lt;/script&gt; 

&lt;/body&gt; &lt;/html&gt;

express session跨域后取不到值_javascript_06

查看浏览器网络,接收到的响应是一个方法调用的js代码,并且方法中的参数也是由另一端的服务器传过来的。

express session跨域后取不到值_json_07


  • 具体案例使用
  • 案例描述:输入款输入用户名,判断用户名是否存在(这句逻辑就不写了)不存在,在输入框下显示”用户不存在”,输入框样式改变。
    步骤:
    (1)动态创建一个script标签
    (2)设置script的URL
    (3)将script标签添加到页面中










  • 模拟服务器端代码【express框架实现】
  • 页面代码

express session跨域后取不到值_javascript_08

jquery实现
vue实现

2.2 方法二:设置CORS响应头实现跨域

  • CORS是什么
    CORS(Cross-Oringin Resource Sharing),跨域资源共享。CORS是官方的跨域解决方案。

CORS特点是不需要再客户端做人任何特殊的操作,完全在服务器中进行处理,支持get和post请求,跨域资源共享标准增添了一组HTTP首部字段,允许服务器生命哪些源站通过浏览器有权限访问哪些资源。

  • CORS工作原理
    CORS通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应后就会对响应’放行’

  • CORS的使用

server.js

前端:

如果需要对所有的路由都解决跨域问题,那么可以写一个中间件,放在所有路由前面,如下

使用

小讯
上一篇 2025-06-09 11:25
下一篇 2025-04-22 14:02

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/162451.html