目录
一 跨域简介
二 跨域的三种情况
三 springboot解决跨域案例
一 跨域简介
什么是跨域?
由于浏览器的一些安全性限制,不允许前端页面访问一些协议不同、域名不同、端口号不同的http接口,例如我本地创建一个html,里面写一个ajax请求访问我服务器springboot应用提供的接口:192.168.1.222:8888/getList
则会出报 No 'Access-Control-Allow-Origin' header is present on the requested resource. 错误。
此类问题我们一般是在接口提供方,即服务端解决。
二 跨域的三种情况
在请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求:
- 协议不同,如 http 和 https;
- 域名不同;如 www.test.com和www.test1.com
- 端口不同。如 8080 和 8081
也就是说,即使域名相同,如果一个使用的是 http,另一个使用的是 https,那么它们也属于跨域访问。常见的跨域问题如下图所示:
三 springboot解决跨域案例
解决跨域的方法主要有:
1 全局系统跨域解决
2 单个方法解决
3 过滤器解决
3.1 全局系统跨域(常见)
编写配置文件,代码如下:
package com.yty.system.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 跨域配置类
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")//*表示允许任何域名使用
.allowCredentials(false) // 是否发送cookie
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD")
.allowedHeaders("*")
.exposedHeaders("*")
.maxAge(3600);
}
}
2 单个方法解决
方法上增加注解:@CrossOrigin
3 采用过滤器,代码如下:
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response1, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) response;
response .addHeader("Access-Control-Allow-Credentials", "true");
response .addHeader("Access-Control-Allow-Origin", "*");
response .setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD");
response .setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
chain.doFilter(request, response1);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
访问如下:
至此 跨域问题解决