-
跨域是如何产生的?
跨域则是是同源策略导致的- 什么事同源策略
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
*同源策略,它是由Netscape提出的一个著名的安全策略。
*现在所有支持JavaScript 的浏览器都会使用这个策略。
*所谓同源是指,域名,协议,端口相同。
*当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面
*当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,
*即检查是否同源,只有和百度同源的脚本才会被执行。
*如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。
-
跨域集中解决方案
-
通过nginx代理
nginx很简单即可处理,此问着重讲Spring Security的解决方案- 通过服务器处理
- 通过Controller添加注解@CrossOrigin,此方法比较繁琐,每个Controller都需要使用此注解,如一些隐性接口(jar包提供)则无法使用注解
- 通过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();//配置所有访问控制,必须认证过后才可以访问
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。