Spring、Spring-Boot、Spring-Security中對CORS(跨域資源共享)的支持


       出於安全原因,瀏覽器禁止AJAX調用當前域之外的域的資源。跨源資源共享(CORS)是由大多數瀏覽器實現的W3C規范,允許您指定哪些類型的跨域請求是被授權的,而不是基於IFRAME或JSONP的不安全且功能較差的工作區。

     Spring MVC HandlerMapping提供了對CORS的內置支持。在成功地將請求映射到處理程序之后,HandlerMapping將檢查給定請求和處理程序的CORS配置,並采取進一步的操作。

       為了啟用跨源請求(例如,源頭是存在的,並且與請求的主機不同),您需要有一些顯式聲明的CORS配置。如果沒有找到匹配的CORS配置,則拒絕請求前請求。在簡單和實際的CORS請求的響應中沒有添加CORS頭,因此瀏覽器拒絕它們。

      每個HandlerMapping都可以通過基於URL模式的Cors映射單獨配置。在大多數情況下,應用程序將使用MVC Java config或XML名稱空間來聲明這樣的映射。

     在HandlerMapping級別上的全局CORS配置可以與更細粒度的、handler級別的CORS配置相結合。例如,帶注解的控制器可以使用類或方法級的@CrossOrigin注解。

@CrossOrigin注解的使用

@RestController
@RequestMapping("/account")
public class AccountController {


    @CrossOrigin
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }


    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

默認情況下@CrossOrigin允許:

 

  • 所有的域。
  • 所有的headers
  • 將控制器方法映射到的所有HTTP方法。
  • maxAge設置為30分鍾。

類級別支持某一特定的域

@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) {
        // ...
    }
}

 

 


類和方法上都使用

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {


    @CrossOrigin("http://domain2.com")
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }


    @DeleteMapping("/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

 

 


Spring JAVA Configuration中 全局配置

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {


    @Override
    public void addCorsMappings(CorsRegistry registry) {


        registry.addMapping("/api/**")
            .allowedOrigins("http://domain2.com")
            .allowedMethods("PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(true).maxAge(3600);


        // Add more mappings...
    }
}

 

 


在SpringBoot中的應用

package org.niugang.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
 * 
 * @Description:跨域訪問配置
 * @Project:boot-sis 
 * @File:CORSMyConfiguration.java 
 * @Package:org.niugang.config 
 * @Date:2018年7月12日下午10:22:10
 * @author:niugang 
 * @Copyright (c) 2018, 863263957@qq.com All Rights Reserved. 
 *
 */
@Configuration
public class CORSConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
   return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
   //addMapping 跨域所能訪問的路徑
   //allowedOrigins:那些域可以訪問,默認為任何域都可以訪問
    registry.addMapping("/api/**").allowedOrigins("*");
   }
  };
}
}

 

 


在SpringSecurity中的應用

 

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


@Override
protected void configure(HttpSecurity http) throws Exception {
http
// by default uses a Bean by the name of corsConfigurationSource  
 //默認配置一個Bean Name為corsConfigurationSource  
.cors().and()
...
}
       //配置那些域可以訪問的我的資源
@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
     configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
    configuration.setAllowedMethods(Arrays.asList("GET","POST"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
      return source;
}
}

 

 
          
        


配置跨域  代碼和上面一樣SpringBoot和Spring Security整合應用

package org.niugang.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
 * 
 * @Description:跨域訪問配置
 * @Project:boot-sis 
 * @File:CORSMyConfiguration.java 
 * @Package:org.niugang.config 
 * @Date:2018年7月12日下午10:22:10
 * @author:niugang 
 * @Copyright (c) 2018, 863263957@qq.com All Rights Reserved. 
 *
 */
@Configuration
public class CORSConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
//addMapping 跨域所能訪問的路徑
//allowedOrigins:那些域可以訪問,默認為任何域都可以訪問
registry.addMapping("/api/**").allowedOrigins("*");
}
};
}
}

 

  • 配置Spring Security

 

 微信公眾號

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM