CORS跨域资源共享及解决方案

简介: CORS跨域资源共享及解决方案

为什么会出现跨域的问题?

Javascript的访问是根据同源策略来的,同源策略即(同端口,同协议,同域名)。现在主流的开发方式都是前后端分离,所以很容易就出现跨域的问题。cors即跨域资源共享,解决了前后端分离的资源共享问题。目前主流的浏览器都支持cors

CORS出现场景 简答请求和非简单请求

有些情况并不会触发cors的预检请求(即Options请求)我们将这种称为简单请求,会触发options请求的为非简单请求

  1. 使用下列方法之一:GET,  HEAD,  POST
  2. 不可以设置http头超出以下列表的字段:
    Accept, Accept-Language,Content-Language,Content-Type (需要注意额外的限制),Viewport-Width, Content-Type等。
  • 值得说一下的是Content-Type,它的值仅限于下列三者之一:text/plain, multipart/form-data,application/x-www-form-urlencoded

满足以上两种条件的为简单请求 不满足则为非简单请求

例子

我后台是采用express启动的服务,端口3000

前台是直接利用webstorm创建的html文件,利用webstorm的本地服务器去请求后台接口,发送ajax请求

可以看到,已经不满足同源策略了,端口不一致。请求头中默认加上了origin,已经触发了跨域

这个时候需要服务端允许你跨域获取资源

重启一下express服务

可以看到,后台只要简单设置一下 response.header('Access-Control-Allow-Origin', '*'),允许任何获取即可解决。

利用Jsonp解决

JSONP由两部分组成:回调函数和数据,回调函数是当响应到来时应该在页面中调用的函数,回调函数的名字一般在请求中指定。当服务器响应时,服务器端就会把该函数和数据拼成字符串返回。

主要就是利用src静态资源引用允许跨域

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="deepClone.js"></script>
<script defer src="http://localhost:3000/test_jsonp?callback=callback"></script>
<!--<script src="http://localhost:3000/test_jsonp?callback=callback"></script>-->
<script>
    // function addScript(url) {
    //     // 创建一个script标签
    //     var scpt = document.createElement('script');
    //     // 设置对应的src
    //     scpt.src = url;
    //     // 追加到页面
    //     document.body.appendChild(scpt);
    // }
    //
    // window.onload = function() {
    //     addScript('http://localhost:3000/callback=dataS')
    // }
    var callback = function(res) {
        console.log(res)
    }
</script>
</body>
</html>

后端express代码

var express = require('express');
var router = express.Router();
var querystring = require('querystring');
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
router.get('/test_jsonp', function(req, res, next) {
  let params = querystring.parse(req.url.split('?')[1]);
  let obj = {
    name: '张三',
    sex: '男'
  };
  // res.status = 200;
  //
  // res.body = params['callback'] + '(' + JSON.stringify(obj) + ')';
  //
  // jsonp返回设置
  res.writeHead(200, { 'Content-Type': 'text/javascript' });
  res.write(params['callback'] + '(' + JSON.stringify(obj) + ')');
  res.end();
});
module.exports = router;

这是一种非常常用的跨域请求方式。主要原理是利用了script 标签可以跨域请求的特性,由其 src属性发送请求到服务器,服务器返回 JavaScript 代码,浏览器接受响应,然后就直接执行了,这和通过 script 标签引用外部文件的原理是一样的。现在淘宝有些还是利用jsonp解决的跨域

目录
相关文章
|
1月前
|
存储 缓存 安全
oss跨域资源共享(CORS Configuration)
oss跨域资源共享(CORS Configuration)
53 4
|
2月前
|
前端开发 API 数据安全/隐私保护
Web前端开发中的跨域资源共享(CORS)解决方案
【2月更文挑战第5天】在Web前端开发中,跨域资源共享(CORS)是一个常见的挑战。本文将探讨CORS的概念和原理,并介绍一些常用的解决方案,包括服务器端配置和前端处理方法,帮助开发者更好地应对跨域请求问题。
115 4
|
16天前
|
前端开发 安全 JavaScript
|
1月前
|
JavaScript 安全 前端开发
js开发:请解释什么是跨域请求(CORS),以及如何解决跨域问题。
CORS是一种W3C标准,用于解决浏览器同源策略导致的跨域数据访问限制。它通过服务器在HTTP响应头添加标志允许特定源进行跨域请求。简单请求无需预检,而预检请求(OPTIONS)用于询问服务器是否接受非简单请求。服务器端配置响应头如`Access-Control-Allow-Origin`等实现CORS策略,客户端JavaScript则正常发起请求。若配置不当,浏览器将阻止跨域访问,保障安全。
23 2
|
1月前
|
前端开发 安全 开发者
前端开发中的跨域资源共享(CORS)问题及解决方案探讨
在前端开发中,跨域资源共享(CORS)是一个常见且重要的问题。本文将深入探讨CORS的原理、影响以及解决方案,帮助开发者更好地应对跨域请求问题。
|
2月前
|
前端开发 开发者
前端开发中的跨域资源共享(CORS)解决方案探讨
【2月更文挑战第2天】跨域资源共享(CORS)是前端开发中常见的问题,本文将深入探讨CORS的原理及解决方案,包括简单请求、预检请求以及常用的CORS解决方案,为前端开发者提供深入的理解和应对CORS问题的有效方法。
36 1
|
2月前
|
Java
springboot+cors跨域处理
springboot+cors跨域处理
26 0
|
2月前
|
前端开发 JavaScript API
探索前端开发中的跨域资源共享(CORS)
【2月更文挑战第3天】在前端开发中,跨域资源共享(CORS)是一个至关重要的话题。本文将深入探讨CORS的概念、工作原理以及如何在前端项目中正确配置和处理跨域请求,帮助开发者更好地理解和应用CORS技术。
29 7
|
2月前
|
前端开发 安全 JavaScript
前端开发中的跨域资源共享(CORS)机制
【2月更文挑战第3天】 在前端开发中,跨域资源共享(CORS)机制是一个重要的安全性问题。本文将介绍CORS的概念、原理和实现方式,并探讨在前端开发中如何处理跨域资源请求,以及如何提高网站的安全性。
|
2月前
|
前端开发 数据安全/隐私保护 UED
探索前端开发中的跨域资源共享(CORS)
【2月更文挑战第3天】在当今Web开发中,跨域资源共享(CORS)扮演着至关重要的角色。本文将深入探讨CORS在前端开发中的作用和实践经验,带你解锁跨域访问的奥秘。