注解@CrossOrigin解決跨域問題

      網友投稿 1123 2022-05-30

      注解@CrossOrigin

      出于安全原因,瀏覽器禁止Ajax調用駐留在當前原點之外的資源。例如,當你在一個標簽中檢查你的銀行賬戶時,你可以在另一個選項卡上擁有EVILL網站。來自EVILL的腳本不能夠對你的銀行API做出Ajax請求(從你的帳戶中取出錢!)使用您的憑據。

      跨源資源共享(CORS)是由大多數瀏覽器實現的W3C規范,允許您靈活地指定什么樣的跨域請求被授權,而不是使用一些不太安全和不太強大的策略,如IFRAME或JSONP。

      一、跨域(CORS)支持:

      Spring Framework 4.2 GA為CORS提供了第一類支持,使您比通常的基于過濾器的解決方案更容易和更強大地配置它。所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin

      二、使用方法:

      1、controller配置CORS

      1.1、controller方法的CORS配置,您可以向@RequestMapping注解處理程序方法添加一個@CrossOrigin注解,以便啟用CORS(默認情況下,@CrossOrigin允許在@RequestMapping注解中指定的所有源和HTTP方法):

      @RestController

      @RequestMapping("/account")

      public class AccountController {

      @CrossOrigin

      @GetMapping("/{id}")

      public Account retrieve(@PathVariable Long id) {

      // ...

      }

      @DeleteMapping("/{id}")

      public void remove(@PathVariable Long id) {

      // ...

      }

      }

      其中@CrossOrigin中的2個參數:

      origins??: 允許可訪問的域列表

      maxAge:準備響應前的緩存持續的最大時間(以秒為單位)。

      1.2、為整個controller啟用@CrossOrigin

      注解@CrossOrigin解決跨域問題

      @CrossOrigin(origins = "http://domain2.com", maxAge = 3600)

      @RestController

      @RequestMapping("/account")

      public class AccountController {

      @GetMapping("/{id}")

      public Account retrieve(@PathVariable Long id) {

      // ...

      }

      @DeleteMapping("/{id}")

      public void remove(@PathVariable Long id) {

      // ...

      }

      }

      在這個例子中,對于retrieve()和remove()處理方法都啟用了跨域支持,還可以看到如何使用@CrossOrigin屬性定制CORS配置。

      1.3、同時使用controller和方法級別的CORS配置,Spring將合并兩個注釋屬性以創建合并的CORS配置。

      @CrossOrigin(maxAge = 3600)

      @RestController

      @RequestMapping("/account")

      public class AccountController {

      @CrossOrigin(origins = "http://domain2.com")

      @GetMapping("/{id}")

      public Account retrieve(@PathVariable Long id) {

      // ...

      }

      @DeleteMapping("/{id}")

      public void remove(@PathVariable Long id) {

      // ...

      }

      }

      1.4、如果您正在使用Spring Security,請確保在Spring安全級別啟用CORS,并允許它利用Spring MVC級別定義的配置。

      @EnableWebSecurity

      public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

      @Override

      protected void configure(HttpSecurity http) throws Exception {

      http.cors().and()...

      }

      }

      2、全局CORS配置

      除了細粒度、基于注釋的配置之外,您還可能需要定義一些全局CORS配置。這類似于使用篩選器,但可以聲明為Spring MVC并結合細粒度@CrossOrigin配置。默認情況下,所有origins and GET, HEAD and POST methods是允許的。

      JavaConfig

      使整個應用程序的CORS簡化為:

      @Configuration

      @EnableWebMvc

      public class WebConfig extends WebMvcConfigurerAdapter {

      @Override

      public void addCorsMappings(CorsRegistry registry) {

      registry.addMapping("/**");

      }

      }

      如果您正在使用Spring Boot,建議將WebMvcConfigurer?bean聲明如下:

      @Configuration

      public class MyConfiguration {

      @Bean

      public WebMvcConfigurer corsConfigurer() {

      return new WebMvcConfigurerAdapter() {

      @Override

      public void addCorsMappings(CorsRegistry registry) {

      registry.addMapping("/**");

      }

      };

      }

      }

      您可以輕松地更改任何屬性,以及僅將此CORS配置應用到特定的路徑模式:

      @Override

      public void addCorsMappings(CorsRegistry registry) {

      registry.addMapping("/api/**")

      .allowedOrigins("http://domain2.com")

      .allowedMethods("PUT", "DELETE")

      .allowedHeaders("header1", "header2", "header3")

      .exposedHeaders("header1", "header2")

      .allowCredentials(false).maxAge(3600);

      }

      3、XML命名空間

      還可以將CORS與MVC XML命名空間配置。

      a、如果整個項目所有方法都可以訪問,則可以這樣配置;此最小XML配置使CORS在/**路徑模式具有與JavaConfig相同的缺省屬性:

      其中* 表示匹配到下一層;** 表示后面不管有多少層,都能匹配。

      如:

      這個可以匹配到的路徑有:

      /api/aaa

      /api/bbbb

      不能匹配的:

      /api/aaa/bbb

      因為* 只能匹配到下一層路徑,如果想后面不管多少層都可以匹配,配置如下:

      注:其實就是一個(*)變成兩個(**)

      b、也可以用定制屬性聲明幾個CORS映射:

      allowed-origins="http://domain1.com, http://domain2.com"

      allowed-methods="GET, PUT"

      allowed-headers="header1, header2, header3"

      exposed-headers="header1, header2" allow-credentials="false"

      max-age="123" />

      allowed-origins="http://domain1.com" />

      請求路徑有/api/,方法示例如下:

      @RequestMapping("/api/crossDomain")

      @ResponseBody

      public String crossDomain(HttpServletRequest req, HttpServletResponse res, String name){

      ……

      ……

      }

      c、如果使用Spring Security,不要忘記在Spring安全級別啟用CORS:

      ...

      4、How does it work?

      CORS請求(包括預選的帶有選項方法)被自動發送到注冊的各種HandlerMapping?。它們處理CORS準備請求并攔截CORS簡單和實際請求,這得益于CorsProcessor實現(默認情況下默認DefaultCorsProcessor處理器),以便添加相關的CORS響應頭(如Access-Control-Allow-Origin)。?CorsConfiguration?允許您指定CORS請求應該如何處理:允許origins, headers, methods等。

      a、AbstractHandlerMapping#setCorsConfiguration()?允許指定一個映射,其中有幾個CorsConfiguration?映射在路徑模式上,比如/api/**。

      b、子類可以通過重寫AbstractHandlerMapping類的getCorsConfiguration(Object, HttpServletRequest)方法來提供自己的CorsConfiguration。

      c、處理程序可以實現?CorsConfigurationSource接口(如ResourceHttpRequestHandler),以便為每個請求提供一個CorsConfiguration。

      5、基于過濾器的CORS支持

      作為上述其他方法的替代,Spring框架還提供了CorsFilter。在這種情況下,不用使用@CrossOrigin或WebMvcConfigurer#addCorsMappings(CorsRegistry),,例如,可以在Spring Boot應用程序中聲明如下的過濾器:

      @Configuration

      public class MyConfiguration {

      @Bean

      public FilterRegistrationBean corsFilter() {

      UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

      CorsConfiguration config = new CorsConfiguration();

      config.setAllowCredentials(true);

      config.addAllowedOrigin("http://domain1.com");

      config.addAllowedHeader("*");

      config.addAllowedMethod("*");

      source.registerCorsConfiguration("/**", config);

      FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));

      bean.setOrder(0);

      return bean;

      }

      }

      三、spring注解@CrossOrigin不起作用的原因

      1、是springMVC的版本要在4.2或以上版本才支持@CrossOrigin

      2、非@CrossOrigin沒有解決跨域請求問題,而是不正確的請求導致無法得到預期的響應,導致瀏覽器端提示跨域問題。

      3、在Controller注解上方添加@CrossOrigin注解后,仍然出現跨域問題,解決方案之一就是:

      在@RequestMapping注解中沒有指定Get、Post方式,具體指定后,問題解決。

      類似代碼如下:

      @CrossOrigin

      @RestController

      public class person{

      @RequestMapping(method = RequestMethod.GET)

      public String add() {

      // 若干代碼

      }

      }

      本博客轉自博客園的博主淼淼之森的《注解@CrossOrigin解決跨域問題》,在此感謝!

      Spring

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Laravel框架數據庫CURD操作、連貫操作總結
      下一篇:京東云搭建個人博客
      相關文章
      亚洲欧洲日产国码无码网站| 亚洲一区二区三区成人网站 | 国产亚洲精品美女久久久久| 亚洲色图黄色小说| 亚洲一二成人精品区| 亚洲爆乳无码一区二区三区| 亚洲精品无码高潮喷水在线| 亚洲啪啪AV无码片| 亚洲AV中文无码乱人伦下载| 亚洲av午夜福利精品一区人妖| 国产亚洲人成网站在线观看不卡 | avtt天堂网手机版亚洲| 亚洲免费人成视频观看| 亚洲人成网网址在线看| 亚洲三级在线免费观看| 亚洲资源最新版在线观看| 香蕉大伊亚洲人在线观看| 亚洲无人区码一二三码区别图片| 亚洲国产日韩精品| 亚洲性色精品一区二区在线| 亚洲日韩精品国产3区| 亚洲爆乳无码精品AAA片蜜桃| 蜜桃传媒一区二区亚洲AV| 国产91成人精品亚洲精品| 亚洲国产中文字幕在线观看| 久久亚洲国产精品五月天婷| 亚洲日韩aⅴ在线视频| 亚洲av永久无码精品秋霞电影影院 | 久久亚洲国产精品123区| 亚洲日本一区二区三区在线| 亚洲AV无码日韩AV无码导航| 色婷婷六月亚洲婷婷丁香| 亚洲国产精品xo在线观看| 国产v亚洲v天堂a无| 亚洲AV女人18毛片水真多| 亚洲综合精品网站| 久久精品国产精品亚洲精品| 亚洲丝袜美腿视频| 亚洲成a人片在线网站| 亚洲最大无码中文字幕| 亚洲成A人片在线观看中文|