SpringBoot項目針對跨域問題的三種解決方案


1. 什么是跨域

  • 要了解跨域,先要知道同源策略。同源策略是由 Netscape 公司提出的一個著名的安全策略,所有支持 JavaScript 的瀏覽器都會使用這個策略。所謂同源是指:協議,域名,端口 全部相同。

  • 瀏覽器從一個域名的網頁去請求另一個域名的資源時,協議,域名,端口任意不同,都會出現跨域問題。

  • 現實工作開發中經常會有跨域的情況。因為公司會有很多項目,也會有很多子域名,各個項目或者網站之間需要相互調用對方的資源,所以跨域請求是避免不了的


2. 解決跨域的幾種方案

方法一:注解

在Spring Boot 中給我們提供了一個注解 @CrossOrigin 來實現跨域,這個注解可以實現方法級別的細粒度的跨域控制。我們可以在類或者方添加該注解,如果在類上添加該注解,該類下的所有接口都可以通過跨域訪問,如果在方法上添加注解,那么僅僅只限於加注解的方法可以訪問。

示例:
	@RestController
	@RequestMapping("/user")
	@CrossOrigin
	public class UserController {
	   @Autowired
	    private UserService userService;

	   @RequestMapping("/findAll")
	    public Object findAll(){
	        return userService.list();
	    }
	}

方法二:實現 WebMvcConfigurer

這里可以通過實現 WebMvcConfigurer 接口中的 addCorsMappings() 方法來實現跨域。

	@Configuration
	public class WebConfig implements WebMvcConfigurer {

	    /**
	     * 跨域支持
	     * @param registry
	     */
	    @Override
	    public void addCorsMappings(CorsRegistry registry) {
	        registry.addMapping("/**")
					.allowedOrigins("*")
					.allowCredentials(true)
					.allowedMethods("GET", "POST", "DELETE", "PUT")
					.allowedHeaders(*)
					.maxAge(3600 * 24);
	    }
	}

addMapping:配置可以被跨域的路徑,可以任意配置,可以具體到直接請求路徑。
allowedOrigins:允許所有的請求域名訪問我們的跨域資源,可以固定單條或者多條內容,如:"http://www.baidu.com",只有百度可以訪問我們的跨域資源。
allowCredentials: 響應頭表示是否可以將對請求的響應暴露給頁面。返回true則可以,其他值均不可以
allowedMethods:允許輸入參數的請求方法訪問該跨域資源服務器,如:POST、GET、PUT、OPTIONS、DELETE等。
allowedHeaders:允許所有的請求header訪問,可以自定義設置任意請求頭信息,如:"X-YAUTH-TOKEN"
maxAge:配置客戶端緩存預檢請求的響應的時間(以秒為單位)。默認設置為1800秒(30分鍾)。


方法三:Nginx 配置解決跨域問題

如果我們在項目中使用了Nginx,可以在Nginx中添加以下的配置來解決跨域

	location / {
	   add_header Access-Control-Allow-Origin *;
	   add_header Access-Control-Allow-Headers X-Requested-With;
	   add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;

	   if ($request_method = 'OPTIONS') {
	     return 204;
	   }
	}

參考文章:
https://www.cnblogs.com/viyoung/p/10285786.html
https://www.cnblogs.com/sueyyyy/p/10129575.html
https://www.cnblogs.com/mmzs/p/9167743.html


免責聲明!

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



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