跨域是如何產生的?
跨域則是是同源策略致使的html
同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,若是缺乏了同源策略,則瀏覽器的正常功能可能都會受到影響。能夠說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。
*同源策略,它是由Netscape提出的一個著名的安全策略。
*如今全部支持JavaScript 的瀏覽器都會使用這個策略。
*所謂同源是指,域名,協議,端口相同。
*當一個瀏覽器的兩個tab頁中分別打開來 百度和谷歌的頁面
*當瀏覽器的百度tab頁執行一個腳本的時候會檢查這個腳本是屬於哪一個頁面的,
*即檢查是否同源,只有和百度同源的腳本纔會被執行。
*若是非同源,那麼在請求數據時,瀏覽器會在控制檯中報一個異常,提示拒絕訪問。java
跨域集中解決方案nginx
經過nginx代理
nginx很簡單便可處理,此問着重講Spring Security的解決方案web
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration public class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowCredentials(true); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } }
@Configuration @EnableResourceServer @EnableGlobalMethodSecurity(prePostEnabled = true) public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { //注入登陸業務處理 @Autowired private LoginAuthenticationFilter loginAuthenticationFilter; @Override public void configure(HttpSecurity http) throws Exception { http //跨域配置開始 .cors().disable() .cors() .and() .authorizeRequests() .requestMatchers(CorsUtils::isPreFlightRequest) .permitAll() //跨域配置結束 .and() .addFilterBefore(loginAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) .and() .requestMatchers().anyRequest() .and() .anonymous() .and() .authorizeRequests() .antMatchers( "/swagger/**", "/v2/api-docs", "/doc.html", "/swagger-ui.html", "/swagger-resources/**").permitAll() .and() .authorizeRequests() .antMatchers("/**").authenticated();//配置全部訪問控制,必須認證事後才能夠訪問 } }