SpringBoot2.x配置Cors跨域

1 跨域的理解

1489234-20181020105311998-2000527204.png

跨域是指:浏览器A服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务器的静态资源或请求。即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源。

同源策略是指:浏览器A服务器B获取的静态资源,包括Html、Css、Js,为了用户安全,浏览器加了限制,其中的Js通过Ajax只能访问B服务器的静态资源或请求。即:浏览器A从哪拿的资源,那资源中就只能访问哪。

同源是指:同一个请求协议(如:Http或Https)、同一个Ip、同一个端口,3个全部相同,即为同源。

2 跨域的处理

跨域的这种需求还是有的,因此,W3C组织制定了一个Cross-Origin Resource Sharing规范,简写为Cors,现在这个规范已经被大多数浏览器支持,从而,处理跨域的需求。

Cors需要在后端应用进行配置,因此,是一种跨域的后端处理方式,这么做也容易理解,一个你不认识的源来访问你的应用,自然需要应用进行授权。除了后端处理方式,也有前端的解决方案,如:JSONP,因这里我们主要讲解SpringBoot2.x对Cors的配置,暂不对前端解决方案进行详细说明。

3 跨域的分类

跨域分为以下3种

名称英文名说明
简单请求Simple Request发起的Http请求符合:
1.无自定义请求头,
2.请求动词为GET、HEAD或POST之一,
3.动词为POST时,Content-Type是application/x-www-form-urlencoded,
multipart/form-data或text/plain之一
预检请求Preflighted Request发起的Http请求符合其中之一:
1.包含了自定义请求头,
2.请求动词不是GET、HEAD或POST,
3.动词是POST时, Content-Type不是application/x-www-form-urlencoded,
multipart/form-data或text/plain。 即:简单请求的相反
凭证请求Requests with Credential发起的Http请求中带有凭证

4 SpringBoot2.x配置Cors

SpringBoot2.x主要提供了两种方式来支持Cors,如下:

方式作用范围说明
@CrossOrigin注解一个Controller中全部接口或是其中一个特定的接口配置、定制特定的请求接口
WebMvcConfigurer对象全部接口适用于全局配置

4.1 使用@CrossOrigin注解

代码实例

@RestController
@RequestMapping(value = "/api/users")
@CrossOrigin
public class UsersController{

    @Autowired
    private UsersService usersService;

    @PostMapping
    @CrossOrigin
    public User create(@RequestBody User user) {
        return userService.save(user);
    }
}

其中,@CrossOrigin注解可以使用以下参数

名称类型范围必填请求头字段
valueString数组类或方法Access-Control-Allow-Origin
originsString数组类或方法是,同value,可以二选一Access-Control-Allow-Origin
methodsString数组类或接口Access-Control-Allow-Methods
maxAgelong类或接口Access-Control-Max-Age
allowCredentialsString类或接口Access-Control-Allow-Credentials
allowedHeadersString数组类或接口Access-Control-Request-Headers
exposedHeadersString数组类或接口Access-Control-Expose-Headers
  • 备注说明
  1. value、origins属性:配置允许访问的源,如: http://anxminise.cc,*表示允许全部的域名
  2. methods属性:配置跨域请求支持的方式,如:GET、POST,且一次性返回全部支持的方式
  3. maxAge属性:配置预检请求的有效时间, 单位是秒,表示:在多长时间内,不需要发出第二次预检请求
  4. allowCredentials属性:配置是否允许发送Cookie,用于 凭证请求, 默认不发送cookie
  5. allowedHeaders属性:配置允许的自定义请求头,用于 预检请求
  6. exposedHeaders属性:配置响应的头信息, 在其中可以设置其他的头信息,不进行配置时, 默认可以获取到Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma字段

4.2 使用WebMvcConfigurer对象

代码实例

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**")
                          .allowedOrigins("*")  
                          .allowCredentials(true)
                          .allowedMethods("GET", "POST", "DELETE", "PUT","PATCH")
                          .maxAge(3600);  
            }
        };
    }
}

其中,通过相应的方法实现跨域请求的配置

方法类方法名称必填请求头字段说明
CorsRegistryaddMapping无, 非Cors属性,
属于SpringBoot配置
配置支持跨域的路径
CorsRegistrationallowedOriginsAccess-Control-Allow-Origin配置允许的源
CorsRegistrationallowedMethodsAccess-Control-Allow-Methods配置支持跨域请求的方法,
如:GET、POST,一次性返回
CorsRegistrationmaxAgeAccess-Control-Max-Age配置预检请求的有效时间
CorsRegistrationallowCredentialsAccess-Control-Allow-Credentials配置是否允许发送Cookie, 用于 凭证请求
CorsRegistrationallowedHeadersAccess-Control-Request-Headers配置允许的自定义请求头, 用于 预检请求
CorsRegistrationexposedHeadersAccess-Control-Expose-Headers配置响应的头信息,
在其中可以设置其他的头信息

转载于:https://www.cnblogs.com/anxminise/p/9808279.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值