跨域问题详解

为什么会出现跨域问题

同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

什么是跨域

url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

非同源限制

【1】无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB
【2】无法接触非同源网页的 DOM
【3】无法向非同源地址发送 AJAX 请求

跨域问题解决

CORS

跨域资源共享(Cross-Origin Resource Sharing, CORS)是一种解决跨域请求的方案,其机制是使用一组额外响应头(Access-Control-Allow-Origin)和预检请求(OPTIONS)来使浏览器有权使用非同源资源。

需要注意

我可以在网关层或者单个服务解决跨域问题,但是别重复解决,否则会出现重复配置问题。

Access to XMLHttpRequest at ‘https://xxx.com/category/list?orgId=1’ from origin 
‘http://localhost:8080’ has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ header 
contains multiple values ‘*, *’, but only one is allowed.
spring、spring boot 解决跨域问题

跨域问题的解决,无非是在响应给浏览器的时候,在请求头中告诉浏览器我允许跨域。
我们可以在过滤器、拦截器中,在响应的请求头中增加对跨域的支持。

public class CorsInterceptor extends HandlerInterceptorAdapter {
	@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        // 允许跨域                      
		response.addHeader("Access-Control-Allow-Origin", "*");
		// 允许前端携带cookie:启用此项后,上面的域名不能为'*',必须指定具体的域名
        // response.addHeader("Access-Control-Allow-Credentials", "true");
        // 允许跨域的方法
        response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT,PATCH, HEAD");
        // 允许跨域的头
        response.addHeader("Access-Control-Allow-Headers", "Content-Type, X-Requested-With");
        // 跨域的有效期,在有效期内,无需检查跨域问题
        response.addHeader("Access-Control-Max-Age", "3600");

		// 该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。
		// response.addHeader("Access-Control-Expose-Headers", "XXX");
		
        return super.preHandle(request, response, handler);
    }        
}

cookie怎么跨域传递

前后端都需要进行处理
前端:

var xhr = new XMLHttpRequest(); 
xhr.withCredentials = true

后端:

response.setHeader("Access-Control-Allow-Credentials", "true"); 

Referrer Policy

referer参数是http请求头header里的一个关键参数,表示的意思是链接的来源地址,比如在页面引入图片、JS 等资源,或者跳转链接

no-referrer
整个 Referer 首部会被移除。访问来源信息不随着请求一起发送

no-referrer-when-downgrade (默认值)
在没有指定任何策略的情况下用户代理的默认行为。在同等安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送 (HTTPS->HTTP)。

origin
在任何情况下,仅发送文件的源作为引用地址。例如 https://example.com/page.html 会将 https://example.com/ 作为引用地址。

origin-when-cross-origin
对于同源的请求,会发送完整的URL作为引用地址,但是对于非同源请求仅发送文件的源。

same-origin
对于同源的请求会发送引用地址,但是对于非同源请求则不发送引用地址信息

strict-origin
在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS),但是在降级的情况下不会发送 (HTTPS->HTTP)。

strict-origin-when-cross-origin
对于同源的请求,会发送完整的URL作为引用地址;在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP)。

unsafe-url
无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。(最不安全的策略了)

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着Web应用程序的不断发展,越来越多的Web开发者需要处理跨域访问的问题。尤其在网站开发中,标签<iframe>存在一些跨域问题,需要得到解决。 解决这些问题的一种方案是使用反向代理服务器。Nginx是一个功能强大的开源服务器软件,可以用来提供反向代理服务,也可以作为Web服务器、邮件服务器和负载均衡器。 在使用Nginx作为反向代理服务器时,可以按如下步骤解决iframe跨域问题: 1.安装和配置Nginx。首先,您需要在服务器上安装Nginx,并确保nginx.conf文件正确配置。配置反向代理服务器,将请求从原始服务器发送到新的服务器。 2.设置虚拟主机。为了使Nginx适用于您的网站,需要设置虚拟主机,配置主机的ip格式和端口号。通常情况下,虚拟主机可以支持多个域名和主机名,可以同时接收多个请求。 3.设置location指令。为了完成反向代理任务,可以使用location指令,将请求传递给正确的服务器,并且从指定的URL获取响应。具体而言,您需要在nginx.conf文件中指定location指令,并告诉Nginx需要向哪个服务器发送请求。 4.启用SSL。如果您的网站需要安全的传输,比如HTTPS,那么您可以使用SSL/TLS加密功能。在Nginx中配置SSL,需要使用SSL module或者OpenSSL来启用。 总之,Nginx是一个非常强大的反向代理服务器,可以很好地解决网站开发中的问题。利用其反向代理功能,您可以很容易地解决iframe跨域访问的问题,确保您的Web应用程序能够正常运行并保持安全性和高可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值