关于ajax跨域:node-server响应头设置允许跨域却仍然存在跨域问题的解决方案

案例明天在做全栈的练习我的项目时,发现在发POST申请时,存在跨域问题(server的header设置了容许跨域),server大略如下 const express = require('express')const app = express()app.use(express.json());app.use(express.urlencoded({ extended: false }));app.post('/login', (request, response) => { //容许跨域 response.setHeader('Access-Control-Allow-Origin','*') response.setHeader('Access-Control-Allow-Headers','*'); response.send('Hello')})前端是用axios发送的ajax申请,这里会有一点影响,然而重点不在这,所以这里不贴代码。 起因剖析点开浏览器的network调试界面,发现除了post申请还有一个options申请,而后看看console里的报错信息 Access to XMLHttpRequest at 'http://127.0.0.1:8000/login' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. 果然发现是preflight request的问题,也就是这个options申请的跨域没有通过。 那又为什么会有这个preflight呢?参考CORS文档发现有这三种状况会发送预申请: 申请办法不是GET/POST/HEAD设置了默认申请头意外的自定义申请头POST申请中的content-type不是 application/x-www-form-urlencodedmultipart/form-datatext/plain然而咱们所用的axios发送的申请默认的content-type是application/json,所以天经地义须要去发送这个预申请,那么只须要让这个预申请跨域通过就好了 解决方案server改路由规定(post->all)最暴力的办法,间接将跨域给到all申请类型,所以预申请的options必定是可能跨域的 app.all('/login', (request, response) => { //容许跨域 response.setHeader('Access-Control-Allow-Origin','*') response.setHeader('Access-Control-Allow-Headers','*'); response.send('Hello')})增加一个options的路由规定这个就是隔靴搔痒的办法,在下方独自增加一条新的规定,应用options申请类型 app.post('/login', (request, response) => { //容许跨域 response.setHeader('Access-Control-Allow-Origin','*') response.setHeader('Access-Control-Allow-Headers','*'); response.send('Hello')})app.options('/login', (request,response) => { response.setHeader("Access-Control-Allow-Origin","*") response.setHeader("Access-Control-Allow-Headers", "*"); response.end()})

November 14, 2021 · 1 min · jiezi

关于ajax跨域:json解决跨域的实现方法及原理

先理解一下同源策略同源策略(英文全称 Same origin policy)是浏览器提供的一个平安性能MDN官网给定的概念:同源策略限度了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互这是一个用于隔离潜在歹意文件的重要平安机制 艰深的了解:浏览器规定,A 网站的 JavaScript,不容许和非同源的网站 C 之间,进行资源的交互 例如: ① 无奈读取非同源网页的 Cookie、LocalStorage 和 IndexedDB ② 无奈接触非同源网页的 DOM ③ 无奈向非同源地址发送 Ajax 申请再理解一下跨域同源指的是两个 URL 的协定、域名、端口统一,反之,则是跨域 呈现跨域的根本原因:**浏览器的同源策略**不容许非同源的 URL 之间进行资源的交互 **留神** 浏览器容许发动跨域申请,然而,跨域申请回来的数据,会被浏览器拦挡,无奈被页面获取到! 现如今,实现跨域数据申请,最次要的两种解决方案,别离是 JSONP 和 CORS。JSONP呈现的早,兼容性好(兼容低版本IE)。是前端程序员为了解决跨域问题,被迫想进去的一种长期解决方案。毛病是只反对 GET 申请,不反对 POST 申请。CORS:呈现的较晚,它是 W3C 规范,属于跨域 Ajax 申请的基本解决方案。反对 GET 和 POST` 申请。毛病是不兼容某些低版本的浏览器其中:CORS次要是后盾工作人在做 个别就是应用一个两头键先截取所有的申请而后再放行 // 跨域拜访app.use((req, res, next) => { // 1. 容许那些客户端拜访 // * 代表容许所有的客户拜访我 res.header('Access-Control-Allow-Origin', '*') // 2. 容许客户端应用那些申请形式拜访我 res.header('Access-Control-Allow-Methods', 'get post,put,delete') next();})理解jsonpJSONP (JSON with Padding) 是 JSON 的一种“应用模式”,可用于解决支流浏览器的跨域数据拜访的问题。JSONP的实现原理因为浏览器同源策略的限度,网页中无奈通过 Ajax 申请非同源的接口数据。然而 <script> 标签不受浏览器同源策略的影响能够通过 src 属性,申请非同源的 js 脚本。因而,JSONP 的实现原理,就是通过 <script> 标签的 src 属性,申请跨域的数据接口,而近程服务端通过调用指定的函数并传入参数来实现传递参数 ...

July 24, 2020 · 2 min · jiezi