springboot 跨域配置cors
生活随笔
收集整理的這篇文章主要介紹了
springboot 跨域配置cors
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
擼了今年阿里、頭條和美團的面試,我有一個重要發現.......>>>
1 跨域的理解
跨域是指:瀏覽器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
@RestController @RequestMapping(value = "/api/users") @CrossOrigin public class UsersController{@Autowiredprivate UsersService usersService;@PostMapping@CrossOriginpublic User create(@RequestBody User user) {return userService.save(user);} }?其中,@CrossOrigin注解可以使用以下參數
?
| value | String數組 | 類或方法 | 是 | Access-Control-Allow-Origin |
| origins | String數組 | 類或方法 | 是,同value,可以二選一 | Access-Control-Allow-Origin |
| methods | String數組 | 類或接口 | 是 | Access-Control-Allow-Methods |
| maxAge | long | 類或接口 | 否 | Access-Control-Max-Age |
| allowCredentials | String | 類或接口 | 否 | Access-Control-Allow-Credentials |
| allowedHeaders | String數組 | 類或接口 | 否 | Access-Control-Request-Headers |
| exposedHeaders | String數組 | 類或接口 | 否 | Access-Control-Expose-Headers |
- 備注說明
?使用WebMvcConfigurer對象
@Configuration public class MyConfiguration {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("*") .allowCredentials(true).allowedMethods("GET", "POST", "DELETE", "PUT","PATCH").maxAge(3600); }};} }或者這個方式:
@Configuration public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE").maxAge(3600).allowCredentials(true);} }其中,通過相應的方法實現跨域請求的配置
| CorsRegistry | addMapping | 是 | 無, 非Cors屬性,? 屬于SpringBoot配置 | 配置支持跨域的路徑 |
| CorsRegistration | allowedOrigins | 是 | Access-Control-Allow-Origin | 配置允許的源 |
| CorsRegistration | allowedMethods | 是 | Access-Control-Allow-Methods | 配置支持跨域請求的方法,? 如:GET、POST,一次性返回 |
| CorsRegistration | maxAge | 否 | Access-Control-Max-Age | 配置預檢請求的有效時間 |
| CorsRegistration | allowCredentials | 否 | Access-Control-Allow-Credentials | 配置是否允許發送Cookie, 用于 憑證請求 |
| CorsRegistration | allowedHeaders | 否 | Access-Control-Request-Headers | 配置允許的自定義請求頭, 用于 預檢請求 |
| CorsRegistration | exposedHeaders | 否 | Access-Control-Expose-Headers | 配置響應的頭信息,? 在其中可以設置其他的頭信息 |
總結
以上是生活随笔為你收集整理的springboot 跨域配置cors的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu16.04设置cron日志
- 下一篇: springboot教程(三)