写在后面
跨域问题并不是 spring 特有的,本文简要的介绍跨域问题的前因后果,以及 spring 解决跨域问题的两种形式。
1. 什么导致了跨域
浏览器的同源策略导致了跨域问题。
1.1 同源策略
同源策略限度了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在歹意文件的重要平安机制。
同源的定义:如果两个页面的协定,端口和主机都雷同,则两个页面具备雷同的源。
1.2 跨源拜访
应用 CORS 容许跨源拜访。
CORS 的工作原理是: 增加新的 HTTP 标头,让服务器形容容许哪些起源从 Web 浏览器读取该信息
那么 CORS 是如何容许跨源拜访的?这篇文章解释的十分具体了,跨域资源共享 CORS 详解
- Spring MVC 的跨域问题
服务器不做任何跨域配置时,通过 ajax 从前端页面 localhost:8080 申请 localhost:8081 时:
并且控制台会报如下谬误:
如果你仔细阅读了后面所给出的博客当前,会很容易了解为什么会呈现下面的问题。
那么 spring 如何解决跨域问题呢?我所找到可能通过以下两种办法来解决:
CrossOrigin 注解
CorsConfiguration 类
2.1 CrossOrigin 注解
该注解能够作用在类以及办法层面上,当作用在类(Controller)层面上时,该类下的所有门路均容许跨域拜访;当作用在办法层面上时,只有以后办法对应的门路容许跨域拜访。
当将注解的 origins 的值设置为“http://localhost:8082”时(咱们理论的 origin 为 http://localhost:8080),拜访会返回 403 状态码,这是个乏味的景象;这应该表明了容许跨域,但你并不是容许的源。
2.2 CorsConfiguration
该类须要在 spring mvc 配置类中应用:
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 设置容许跨域的门路
registry.addMapping("/**")
// 设置容许跨域申请的域名
.allowedOrigins("*")
// 是否容许证书 不再默认开启
.allowCredentials(true)
// 设置容许的办法
.allowedMethods("*")
// 跨域容许工夫
.maxAge(3600);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new StringHttpMessageConverter());
converters.add(new MappingJackson2HttpMessageConverter());
}
}
或者更高级的配置类:
@Configuration
public class AdvancedWebMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void addCorsMappings(CorsRegistry registry) {super.addCorsMappings(registry);
// 设置容许跨域的门路
registry.addMapping("/**")
// 设置容许跨域申请的域名
.allowedOrigins("*")
// 是否容许证书 不再默认开启
.allowCredentials(true)
// 设置容许的办法
.allowedMethods("*")
// 跨域容许工夫
.maxAge(3600);
}
}