什么是浏览器跨域和springboot怎么解决
-
跨域:浏览器同源策略 1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。 最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"
协议相同 http https 域名相同 www.xdclass.net 端口相同 80 81 一句话:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 浏览器控制台跨域提示: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
-
解决方法
1)JSONP (现在使用较少)
2)Http响应头配置允许跨域 (Nginx)
nginx层配置 https://www.cnblogs.com/hawk-whu/p/6725699.html
3)程序代码中处理 SpringBoot 通过拦截器配置
//表示接受任意域名的请求,也可以指定域名
response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
//该字段可选,是个布尔值,表示是否可以携带cookie
response.setHeader("Access-Control-Allow-Credentials", "true");
//允许跨域的请求方法
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
//请求头信息
response.setHeader("Access-Control-Allow-Headers", "*");
//判断前端简单请求 非简单请求(请求为json类型为非简单请求)
if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
return true;
}
Step1:配置拦截器
/**
* 跨域拦截器
*/
public class CorsInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//表示接受任意域名的请求,也可以指定域名
response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
//该字段可选,是个布尔值,表示是否可以携带cookie
response.setHeader("Access-Control-Allow-Credentials", "true");
//允许跨域的请求方法
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
//请求头信息
response.setHeader("Access-Control-Allow-Headers", "*");
//判断前端简单请求 非简单请求(请求为json类型为非简单请求)
//遇简放行
if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
return true;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
Step2:配置拦截路径
@Configuration
public class InterceptConfig implements WebMvcConfigurer {
@Bean
CorsInterceptor corsInterceptor(){
return new CorsInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截全部 跨域 需要放在最上面
registry.addInterceptor(corsInterceptor()).addPathPatterns("/**");
}
}
response的跨域请求头就获取到了
- options请求,这个需要注意
- 注意点: 假如接口报错,则跨域配置可能不生效(报错建议断点调试,排除异常错误)