springsecurity之跨域

本文介绍了CORS(Cross-Origin Resource Sharing)在解决跨域问题中的作用。CORS通过预检请求确保安全,允许服务器指定允许的跨域请求。简单请求无需预检,而预检请求用于非简单请求。带凭证的请求需要服务器明确允许。Spring Security提供了对CORS的良好支持,可以通过配置启用并定制CORS策略。
摘要由CSDN通过智能技术生成

从协议部分开始到端口部分结束,只要与请求URL不同即被认为跨域,域名与域名对应的IP也不能幸免。

浏览器解决跨域问题的方法有多种,包括JSONP、Nginx转发和CORS等。其中,JSONP和CORS需要后端参与。

CORS(Cross-Origin Resource Sharing)

通常情况下,跨域请求即便在不被支持的情况下,服务器也会接
收并进行处理,在CORS的规范中则避免了这个问题。

浏览器首先会发起一个请求方法为OPTIONS 的预检请求,用于确认服务器是否允许跨域,只有在得到许可后才会发出实际请求。此外,预检请求还允许服务器通知浏览器跨域携带身份凭证(如cookie)。

在这里插入图片描述
* 匹配所有站点,表示允许来自所有域的请求。但并非所有情况都简单设置即可,如果需要浏览器在发起请求时携带凭证信息,则不允许设置为 * 。

如果设置了具体的站点信息,则响应头中的 Vary字段还需要携带Origin属性,因为服务器对不同的域会返回不同的内容:

在这里插入图片描述
Access-Control-Allow-Methods字段仅在预检请求的响应中指定有效,用于表明服务器允许跨域的HTTP方法,多个方法之间用逗号隔开。

Access-Control-Allow-Headers 字段仅在预检请求的响应中指定有效,用于表明服务器允许携带的首部字段。多个首部字段之间用逗号隔开。

Access-Control-Max-Age 字段用于指明本次预检请求的有效期,单位为秒。在有效期内,预检请求不需要再次发起。

当Access-Control-Allow-Credentials字段取值为true时,浏览器会在接下来的真实请求中携带用户凭证信息(cookie等),服务器也可以使用Set-Cookie向用户浏览器写入新的cookie。注意,使用Access-Control-Allow-Credentials时,Access-Control-Allow-Origin不应该设置为*。

在使用CORS时,通常有以下三种访问控制场景:

1.简单请求

在CORS中,并非所有的跨域访问都会触发预检请求。例如,不携带自定义请求头信息的GET 请求、HEAD 请求,以及 Content-Type 为application/x-www-form-urlencoded、multipart/form-data或text/plain的POST请求,这类请求被称为简单请求。

浏览器在发起请求时,会在请求头中自动添加一个 Origin 属性,值为当前页面的 URL首部。当服务器返回响应时,若存在跨域访问控制属性,则浏览器会通过这些属性判断本次请求是否被允许,如果允许,则跨域成功(正常接收数据)。

在这里插入图片描述
这种跨域请求非常简单,只需后端在返回的响应头中添加 Access-Control-Allow-Origin 字段并填入允许跨域访问的站点即可。

2.预检请求

预检请求不同于简单请求,它会发送一个 OPTIONS 请求到目标站点,以查明该请求是否安全,防止请求对目标站点的数据造成破坏。若是请求以 GET、HEAD、POST 以外的方法发起;或者使用POST方法,但请求数据为application/x-www-form-urlencoded、multipart/form-data和text/plain以外的数据类型;再或者,使用了自定义请求头,则都会被当成预检请求类型处理。

3.带凭证的请求

带凭证的请求,顾名思义,就是携带了用户cookie等信息的请求。

在这里插入图片描述
上面在使用XMLHttpRequest时,指定了withCredentials为true。浏览器在实际发出请求时,将同时向服务器发送 cookie,并期待在服务器返回的响应信息中指明 Access-Control-AllowCredentials为true,否则浏览器会拦截,并抛出错误。

Spring Security对CORS提供了非常好的支持,只需在配置器中启用CORS支持,并编写一个CORS配置源即可

package com.zit.springsecurity.configuration;

import com.zit.springsecurity.service.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值