办理跨域请求的问题(CORS)

打印 上一主题 下一主题

主题 1521|帖子 1521|积分 4563

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次
办理跨域请求问题的方法
1. 服务器端设置响应头
2. JSONP(JSON with Padding)
3. 代理服务器
场景示例
前端代码(使用 Fetch API)
后端代码(使用 Node.js + Express 并设置 CORS 响应头)


跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种当代欣赏器为了安全而实验的同源策略所引发的问题。同源策略要求欣赏器在访问不同源(协议、域名、端口三者任意一个不同即为不同源)的资源时进行限定。以下具体介绍办理跨域请求问题(CORS)的方法。
办理跨域请求问题的方法

1. 服务器端设置响应头

这是办理 CORS 问题最常见和推荐的方法,通过在服务器端设置响应头来允许跨域请求。
原理:服务器通过设置特定的响应头,告诉欣赏器哪些源可以访问该资源,以及允许的请求方法、请求头和是否允许携带凭据等信息。
示例代码(以 Node.js + Express 为例)
  1. const express = require('express');
  2. const app = express();
  3. // 允许所有源的跨域请求
  4. app.use((req, res, next) => {
  5.     res.setHeader('Access-Control-Allow-Origin', '*'); // 允许所有源访问
  6.     res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); // 允许的请求方法
  7.     res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); // 允许的请求头
  8.     next();
  9. });
  10. // 处理 GET 请求
  11. app.get('/api/data', (req, res) => {
  12.     res.json({ message: 'This is some data from the server.' });
  13. });
  14. const port = 3000;
  15. app.listen(port, () => {
  16.     console.log(`Server is running on port ${port}`);
  17. });
复制代码
解释


  • Access-Control-Allow-Origin:指定允许访问该资源的源。* 表示允许全部源访问,但在生产环境中,为了安全起见,建议指定具体的源。
  • Access-Control-Allow-Methods:指定允许的请求方法。
  • Access-Control-Allow-Headers:指定允许的请求头。
2. JSONP(JSON with Padding)

JSONP 是一种古老的跨域数据交互技能,它使用了 <script> 标签的 src 属性不受同源策略限定的特点。
原理:服务器返回的数据被包裹在一个回调函数中,前端页面通过动态创建 <script> 标签来请求该数据,当请求完成后,会执行回调函数并将数据传递给它。
示例代码
前端代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>JSONP Example</title>
  7. </head>
  8. <body>
  9.     <script>
  10.         function handleData(data) {
  11.             console.log(data);
  12.         }
  13.         const script = document.createElement('script');
  14.         script.src = 'http://example.com/api/data?callback=handleData';
  15.         document.body.appendChild(script);
  16.     </script>
  17. </body>
  18. </html>
复制代码
服务器端代码(以 Node.js 为例)
  1. const http = require('http');
  2. const server = http.createServer((req, res) => {
  3.     const url = new URL(req.url, `http://${req.headers.host}`);
  4.     const callback = url.searchParams.get('callback');
  5.     const data = { message: 'This is some data from the server.' };
  6.     const jsonp = `${callback}(${JSON.stringify(data)})`;
  7.     res.writeHead(200, { 'Content-Type': 'application/javascript' });
  8.     res.end(jsonp);
  9. });
  10. const port = 3000;
  11. server.listen(port, () => {
  12.     console.log(`Server is running on port ${port}`);
  13. });
复制代码
范围性:JSONP 只支持 GET 请求,并且安全性较低,容易受到 XSS 攻击。
3. 代理服务器

在开辟环境中,可以使用代理服务器来办理跨域问题。代理服务器位于客户端和目标服务器之间,客户端向代理服务器发送请求,代理服务器再将请求转发到目标服务器,并将响应返回给客户端。
示例代码(以 Vue CLI 为例)
在 vue.config.js 中设置代理:
  1. module.exports = {
  2.     devServer: {
  3.         proxy: {
  4.             '/api': {
  5.                 target: 'http://example.com', // 目标服务器地址
  6.                 changeOrigin: true,
  7.                 pathRewrite: {
  8.                     '^/api': ''
  9.                 }
  10.             }
  11.         }
  12.     }
  13. };
复制代码
解释


  • target:目标服务器的地点。
  • changeOrigin:是否改变请求的源。
  • pathRewrite:对请求路径进行重写。
场景示例

假设你有一个前端项目运行在 http://localhost:8080,后端 API 服务运行在 http://localhost:3000,你想从前端项目中请求后端 API 的数据。
前端代码(使用 Fetch API)

  1. fetch('http://localhost:3000/api/data')
  2.   .then(response => response.json())
  3.   .then(data => console.log(data))
  4.   .catch(error => console.error('Error:', error));
复制代码
后端代码(使用 Node.js + Express 并设置 CORS 响应头)

  1. const express = require('express');
  2. const app = express();
  3. app.use((req, res, next) => {
  4.     res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080');
  5.     res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  6.     res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  7.     next();
  8. });
  9. app.get('/api/data', (req, res) => {
  10.     res.json({ message: 'This is some data from the server.' });
  11. });
  12. const port = 3000;
  13. app.listen(port, () => {
  14.     console.log(`Server is running on port ${port}`);
  15. });
复制代码
通过以上设置,前端项目就可以正常请求后端 API 的数据,办理了跨域问题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表