当前位置: 首页 > wzjs >正文

北京建设部安全员证书查询网站做一元购物网站

北京建设部安全员证书查询网站,做一元购物网站,开发者选项怎么关闭,17做网店类似网站1.引言 在现代前端开发中,跨域资源共享(Cross-Origin Resource Sharing, CORS)是一种通过设置 HTTP 头来允许或阻止不同源之间的资源访问的机制。浏览器出于安全考虑,默认情况下会阻止跨域请求。本文将详细介绍 CORS 的工作原理、…

1.引言

在现代前端开发中,跨域资源共享(Cross-Origin Resource Sharing, CORS)是一种通过设置 HTTP 头来允许或阻止不同源之间的资源访问的机制。浏览器出于安全考虑,默认情况下会阻止跨域请求。本文将详细介绍 CORS 的工作原理、常见的 CORS 错误及其解决方案。

2. 什么是 CORS?

CORS 是一种浏览器安全机制,用于防止跨域资源请求带来的潜在安全风险。浏览器在执行跨域请求时,会检查目标服务器是否允许访问。如果服务器没有正确设置 CORS 头信息,浏览器将阻止跨域请求,并返回 CORS 错误。

2.1 同源策略

CORS 是基于**同源策略(Same-Origin Policy)**的。所谓同源,指的是协议(scheme)、域名(hostname)和端口号(port)三者完全一致。同源策略规定,只有同源的请求才会被允许访问。跨域请求,即不同源的请求,需要通过 CORS 头来管理。

示例:
以下两个 URL 属于同源:

  • https://example.com

  • https://example.com:443

而以下 URL 则属于跨域请求:

  • https://api.example.com(域名不同)

  • https://example.com:8080(端口不同)

  • http://example.com(协议不同)

2.2 CORS 请求的类型

CORS 请求可以分为以下两种类型:

简单请求:GET、POST、HEAD 等方法且没有自定义的 HTTP 头信息,浏览器直接发送请求。
预检请求(Preflight Request):对非简单请求(如 PUT、DELETE 或自定义头信息)会先发送 OPTIONS 请求,确认服务器是否允许再发送实际请求。

3. CORS 错误的原因

浏览器在处理跨域请求时,如果没有收到目标服务器的明确许可(通过 CORS 头信息),会抛出 CORS 错误,常见错误包括:

Access-Control-Allow-Origin 头缺失或配置错误
Access-Control-Allow-Methods 头未正确配置允许的 HTTP 方法
Access-Control-Allow-Headers 头未正确声明自定义的请求头

 4. 解决办法

1. 服务器端配置 CORS 头

最直接的方式是服务器端响应中添加 CORS 相关的头信息来允许跨域请求。常见的 CORS 头包括:

  • Access-Control-Allow-Origin: 允许哪些域名访问资源。可以指定单个域名,或者设置为 * 允许所有域名访问。
  • Access-Control-Allow-Methods: 允许的 HTTP 方法,如 GET, POST, PUT, DELETE 等。
  • Access-Control-Allow-Headers: 允许的请求头,如 Content-Type, Authorization 等。
  • Access-Control-Allow-Credentials: 是否允许发送 Cookie 信息(值为 truefalse)。
  • Access-Control-Max-Age: 指定预检请求的结果缓存时间(单位是秒)。
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true

在服务器端配置这些头信息后,浏览器会根据这些信息判断是否允许跨域请求。需要注意的是,Access-Control-Allow-Origin 不能设置为 *,如果需要携带凭证(如 Cookies),必须指定明确的域名。

2. 使用预检请求(Preflight Request)

对于一些复杂请求(如使用了 PUTDELETE 方法,或者自定义了请求头),浏览器会首先发送一个 OPTIONS 请求来询问服务器是否允许跨域操作。服务器需要对此做出响应并返回 CORS 头。

示例:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type

服务器在响应中包含上述头信息,表示允许来自指定源的请求。

3. 通过代理解决

如果服务器无法直接修改 CORS 配置,可以通过代理的方式解决跨域问题。前端应用将请求发送到本地的代理服务器,由代理服务器转发请求到目标服务器。这样浏览器会认为请求和响应来自同一域。

示例:

使用 Node.js 创建代理服务器,或者前端框架(如 Vue 或 React)中的开发服务器可以配置代理。

Node.js 代理示例:

const express = require('express');
const app = express();
const axios = require('axios');app.use('/api', (req, res) => {axios.get(`https://target-server.com${req.url}`).then(response => {res.json(response.data);}).catch(error => {res.status(500).send(error);});
});app.listen(3000, () => {console.log('Proxy server running on http://localhost:3000');
});

在上述示例中,前端请求 http://localhost:3000/api,代理服务器将请求转发到 https://target-server.com,从而避免了跨域问题。

4. JSONP(仅限 GET 请求)

JSONP 是一种传统的解决跨域问题的方式,通过动态插入 <script> 标签来实现跨域。它只适用于 GET 请求,并且需要服务器支持 JSONP 格式。

示例:

function handleResponse(data) {console.log(data);
}var script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.body.appendChild(script);

需要注意的是,JSONP 存在安全隐患,且仅支持 GET 请求,因此在现代开发中使用较少。

5. WebSocket

WebSocket 协议支持跨域通信,可以用于实时应用。它不像 HTTP 请求那样受到 CORS 限制,但需要服务器支持 WebSocket。

示例:

var socket = new WebSocket('ws://www.example.com/socket');
socket.onopen = function() {socket.send('Hello Server!');
};
socket.onmessage = function(event) {console.log('Received:', event.data);
};

WebSocket 适用于需要实时双向通信的场景,如在线聊天、实时数据推送等。

6. 使用 PostMessage

HTML5 中的 postMessage 方法允许跨源通信,适用于不同源的窗口或 iframe 之间的通信。

示例:

<!-- 父页面 -->
<iframe id="iframe" src="https://www.example.com/child.html"></iframe>
<script>var iframe = document.getElementById('iframe');iframe.onload = function() {var data = { name: 'Alice' };iframe.contentWindow.postMessage(data, 'https://www.example.com');};window.addEventListener('message', function(event) {if (event.origin === 'https://www.example.com') {console.log('Received from child:', event.data);}});
</script>

在上述示例中,父页面通过 postMessage 向子页面发送数据,子页面通过监听 message 事件接收数据。

7. Nginx 反向代理

通过 Nginx 配置反向代理,将请求转发到目标服务器,从而避免浏览器的同源策略限制。

示例:

server {listen 80;server
::contentReference[oaicite:0]{index=0}

 8. Vue3 + Vite项目下的解决方案

通过Vite的开发服务器代理功能,可以将本地的请求代理到不同的服务器,从而避免跨域问题。以下是具体步骤:

8.1 创建Vue3 + Vite项目
npm create vite@latest
cd your-project-name
npm install

选择Vue3模板,并进入项目目录。

8.2 配置Vite的代理

在Vite项目的根目录下找到vite.config.ts(或vite.config.js),并进行以下配置:

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';export default defineConfig({plugins: [vue()],server: {proxy: {'/api': {target: 'http://api.example.com', // 目标服务器changeOrigin: true, // 是否改变请求源rewrite: (path) => path.replace(/^\/api/, ''), // 重写路径},},},
});

这段代码是一个用于配置 Vite 项目的 vite.config.ts(或者 .js)文件的示例。它做了以下几件事:

  1. 引入依赖

    • import { defineConfig } from 'vite'; 这一行从 Vite 库中导入了 defineConfig 函数,这是 Vite 推荐的配置方式,可以帮助 Vite 推断出配置的类型。
    • import vue from '@vitejs/plugin-vue'; 这一行引入了 Vite 的 Vue 插件,用于支持 Vue 组件的加载和构建。
  2. 定义 Vite 配置defineConfig 函数用来定义和导出 Vite 配置对象。这是推荐的方式,它可以提供类型推导和 IntelliSense。

  3. 配置 server 中的 proxy: 在 server 配置项中,定义了代理设置。这里的目的是解决跨域问题或将某些 API 请求代理到其他服务器。

    • '/api': 这表示当你在开发环境中请求以 /api 开头的 URL 时,Vite 会自动将这些请求代理到其他服务器。
    • target: 'http://api.example.com': 这是代理目标服务器的 URL。当请求路径匹配 /api 时,会被转发到 http://api.example.com
    • changeOrigin: true: 这意味着请求会被代理时,Origin HTTP 头会被设置为目标 URL 的 origin。通常用于避免 CORS 问题。
    • rewrite: (path) => path.replace(/^\/api/, ''): 这表示请求的路径会在转发到目标服务器之前进行重写。/^\/api/ 匹配路径开头的 /api,然后将其去掉。所以如果你请求 /api/user,它会被重写为 /user,并被转发到 http://api.example.com/user
8.3 发送请求

在Vue组件中,可以通过axios或者fetch发送请求。例如:

<template><div><button @click="fetchData">获取数据</button><div v-if="data">{{ data }}</div></div>
</template><script lang="ts">
import { defineComponent, ref } from 'vue';
import axios from 'axios';export default defineComponent({setup() {const data = ref(null);const fetchData = async () => {try {const response = await axios.get('/api/data');data.value = response.data;} catch (error) {console.error('请求错误:', error);}};return {data,fetchData,};},
});
</script>

文章转载自:

http://EUUe7Ouw.fhqsm.cn
http://1h76d2hv.fhqsm.cn
http://l0gO7Cb6.fhqsm.cn
http://TO1gyp5M.fhqsm.cn
http://TU0oh1ky.fhqsm.cn
http://Nvxaor26.fhqsm.cn
http://52nGiBuc.fhqsm.cn
http://N9zZ0rkm.fhqsm.cn
http://PAf06OfM.fhqsm.cn
http://1PLAiVSO.fhqsm.cn
http://Oshf9lP8.fhqsm.cn
http://dTVJ9yI3.fhqsm.cn
http://STXhh5aQ.fhqsm.cn
http://pSK8L3cZ.fhqsm.cn
http://t5Nklxzi.fhqsm.cn
http://7QQRq6SY.fhqsm.cn
http://y2LBisq1.fhqsm.cn
http://q1twDG6x.fhqsm.cn
http://2b7ZC5WP.fhqsm.cn
http://0mMQ9ans.fhqsm.cn
http://L6MStrTu.fhqsm.cn
http://LjwNtJJb.fhqsm.cn
http://WR24AUaJ.fhqsm.cn
http://b7iYPyxC.fhqsm.cn
http://NqSAACa1.fhqsm.cn
http://yZMkF1Qh.fhqsm.cn
http://O4RhpZDZ.fhqsm.cn
http://hnpycmwW.fhqsm.cn
http://sPDdXpLZ.fhqsm.cn
http://MArNQGLl.fhqsm.cn
http://www.dtcms.com/wzjs/701031.html

相关文章:

  • 域名到期对网站的影响二手域名
  • 网站建设需什么软件网站seo源码
  • 百度扫一扫入口win优化大师官网
  • 购买服务器后如何做网站免费云服务器
  • 湖南做网站 地址磐石网络凡科网站怎么修改
  • 一个网站里有两个网页怎么做中国建设银行洛阳分行官网站
  • 数字化档案馆及网站的建设wordpress 访问优化
  • 景德镇网站建设景德镇做百度推广去些网站加客户
  • 招标网站哪个好网站建设流程资料
  • 在哪里建立个人网站wordpress只显示到菜单
  • 西宁专业网站建设公司做彩票网站能挣到钱吗?
  • 备案中的网站信息怎么填建设网站空间怎么预算
  • wordpress老网站重装法电子书资源wordpress主题
  • 吉利汽车网站开发环境分析佛山专业网站建设价格
  • 给自己广告公司宣传单页式网站 seo
  • 网站开发需要兼容到ie几关于网站图片
  • 绚丽网站月夜直播免费看
  • 漳州正规网站建设公司网站公司建站
  • 网站怎样做权重天猫与京东的网站建设管理
  • 网站制作新报价电脑网站设计公司
  • 域名 网站郑州网络优化实力乐云seo
  • 比较好的免费网站红色logo做网站
  • 用axuer 做网站产品原型wps免费模板网站
  • 重庆哪里可以做公司网站中国住房和建设部厅查询网站
  • 湖州长兴做网站小型教育网站开发与设计
  • h5页面怎么生成链接网络seo公司
  • 网站制作费用要多少钱苏州住房与城乡建设部网站
  • 查域名网站wordpress的中文插件
  • 谷歌网站提交入口wordpress编辑器知乎
  • 揭阳网站建设解决方案天津南开做网站公司