跨域問題出於瀏覽器的同源策略限制。同源策略(Sameoriginpolicy)是一種約定,它是瀏覽器最核心也最基本的安全功能,若是缺乏了同源策略,則瀏覽器的正常功能可能都會受到影響。能夠說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。同源策略會阻止一個域的javascript腳本和另一個域的內容進行交互。所謂同源(即指在同一個域)就是兩個頁面具備相同的協議(protocol),主機(host)和端口號(port)。javascript
CORS 是跨域資源分享(Cross-Origin Resource Sharing)的縮寫。它是 W3C 標準,屬於跨源 AJAX 請求的根本解決方法。java
當web項目僅部署在Tomcat等服務器時,咱們能夠添加Java跨域配置;假設項目採用了Nginx,跨域任務能夠交給Nginx。nginx
完整的Nginx跨域配置示例web
server { listen 3002; server_name localhost; location /hello { # 指定容許跨域的方法,*表明全部,也可設置具體方法。 add_header Access-Control-Allow-Methods $http_access_control_request_method; # 預檢命令的緩存,若是不緩存每次會發送兩次請求 add_header Access-Control-Max-Age 3600; # 帶cookie請求須要加上這個字段,並設置爲true add_header Access-Control-Allow-Credentials true; # 表示容許這個域跨域調用(客戶端發送請求的域名和端口) # $http_origin動態獲取請求客戶端請求的域 不用*的緣由是帶cookie的請求不支持*號 add_header Access-Control-Allow-Origin $http_origin; # 表示請求頭的字段 動態獲取 add_header Access-Control-Allow-Headers $http_access_control_request_headers; # OPTIONS預檢命令,預檢命令經過時才發送請求 # 檢查請求的類型是否是預檢命令 if ($request_method = OPTIONS){ return 200; } } }
原理與nignx相同,修改請求信息。 本類做爲一個bean裝載到spring容器中。spring
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { // Cors配置 CorsConfiguration config = new CorsConfiguration(); // 1. 設置請求域名 config.addAllowedOrigin("http://localhost:8080"); // 本地ip config.addAllowedOrigin("http://192.168.233.130:8080"); // 虛擬機 config.addAllowedOrigin("http://49.232.170.99"); // 外網ip config.addAllowedOrigin("*"); // 任意 // 2. 設置容許的header config.addAllowedHeader("*"); // 3. 設置容許請求的方法 config.addAllowedMethod("*"); // 4. 設置是否發送cookie config.setAllowCredentials(true); // 爲URL添加路由 UrlBasedCorsConfigurationSource corsSource = new UrlBasedCorsConfigurationSource(); corsSource.registerCorsConfiguration("/**", config); return new CorsFilter(corsSource); } }