跨域是如何产生的?
跨域则是是同源策略导致的
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
*同源策略,它是由Netscape提出的一个著名的安全策略。
*现在所有支持JavaScript 的浏览器都会使用这个策略。
*所谓 同源是指,域名,协议,端口相同 。
*当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面
*当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,
*即检查是否同源,只有和百度同源的脚本才会被执行。
*如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。
跨域集中解决方案
通过nginx代理
nginx很简单即可处理,此问着重讲Spring Security的解决方案
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();//配置所有访问控制,必须认证过后才可以访问 } }