首先了解一下同源策略:同源策略、是一种约定,是浏览器最核心也会最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。所谓同源是指“协议+端口+域名”三者相同;即使是三者中有一个不同就会产生这个跨越的问题。
首先我们来看一个小例子:
用jsonp解决跨越的原理也比较简单,因为在JS中script标签的src是不受同源策略的限制,也就是说可以跨越请求数据。但是这个script标签的src请求数据也有一个缺点,就是只能发送get请求;虽然说可以解决跨越,但是安全性上面就没有安全可言了哈。而使用jsonp时对于后端来说它返回的是一个函数对,而不是一个字符串也不是一个json。所以说在前端时要提前把这个函数给定义好。等返回时它就会把这个值注入到函数的参数里面,此时将实现了跨域的访问,也就是拿到了后端返回过来的值。
前端实例代码:
//当你向/api发送GET请求时,这个函数会被调用。//req是一个包含请求信息的对象,res是一个用于构建响应的对象app.get('/api',(req,res)=>{//首先创建data的对象,其中包含一个消息"Hello,world!"constdata={message:'Hello,world!'};//从请求的查询参数中获取callback参数。查询参数是URL中后面的部分,//例如/apicallback=myFunctionconstcallback=req.query.callback;//将callback和data一起发送回客户端。data对象被转换为JSON格式,//然后被插入到callback函数调用中。这是JSONP(JSONwithPadding)的一种实现方式,//它允许跨域请求res.send(`${callback}(${JSON.stringify(data)})`);});2.2前端解决使用代理dev在开发环境中,我们可以通过配置代理服务器来实现跨域请求。通过设置一个代理服务器将前端的请求转发到目标服务器上,绕过浏览器的同源策略限制,从而解决跨域问题。这种方法对于前端开发人员来说比较便捷,无需对后端进行任何修改。
配置示例(webpack.config.js):
前端代码示例(使用fetch函数):
通过前端设置代理服务器,我们可以使得跨域请求在开发环境中变得更加简单和方便。同时,这种方法不会涉及到后端代码的修改,适用于前端开发人员快速解决跨域问题的场景。需要注意的是,在生产环境中,代理服务器的设置应该由运维人员来负责,并且不建议将代理服务器用于生产环境。
后端代码示例(以Node.js和Express框架为例):
需要注意的是,对于某些自定义的请求头部信息,如Authorization,需要在Access-Control-Allow-Headers中进行明确的设置,才能被浏览器允许跨域访问。另外,如果前端请求中包含了凭证,例如发送了Cookie,需要设置Access-Control-Allow-Credentials为true才能成功发送跨域请求。
在生产环境中,常用的服务器软件Nginx可以作为反向代理服务器来解决跨域问题。通过在Nginx的配置中添加相应的反向代理规则,可以实现跨域请求的转发。
配置示例(nginx.conf):
需要注意的是,上述配置示例只是基础的示范,具体的配置可能会因为实际环境和需求的不同而有所差异。你需要根据自己的实际情况进行相应的配置,例如修改域名、路径和代理目标等。另外,Nginx还有更多的高级配置选项和优化策略可以用于实际生产环境中。
通过运维人员的设置,使用Nginx作为反向代理服务器可以实现跨域请求的转发,并在生产环境中有效地解决跨域问题。这种方式将跨域请求的处理逻辑集中在服务器端,对于前端开发人员而言更加方便和透明。