Cors跨域解决

室与
• 阅读 1661

一、浏览器跨域问题产生

1、跨源资源共享(CORS)中文文档:

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

2、什么是浏览器跨域问题

指的是浏览器不能执行其他网站的脚本。JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象,即同源策略。就好比我已经登录A网页,A网页上已经存储的cookie信息,B网页不能打开,B网页不能请求A网页的资源,除非这两个网页"同源"。同源意思是两个网页协议相同、域名相同、端口相同。

3、同源策略

同源策略是指:协议相同、域名相同、端口相同都要相同,只要一个不同就会产生跨域问题。 例子: 已有URL:http://www.example.com/hhb/index.html ,与以下URL同源情况: ①、http://www.example.com/hhb/manager.html
同源(同一域名下),可访问 ②、https://www.example.com/hhb/index.html
不同源(协议不同https),不可访问 ③、http://examle.com/hhb/index.html
不同源(域名不同),不可访问 ④、http://www.example.com:81/index.html 不同源(端口号不同),不可访问

同源策略目的

同源策略的目的是为了保证用户信息的安全。防止恶意的网站盗取数据。Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确CORS响应头。

二、跨域流程

Cors跨域解决

1、示例登录请求(login)

这个我们实现跨域登录请求时,产生了两次login请求!

Cors跨域解决

2、预检请求,OPTIONS

在发送真实请求前,会发送一个预检请求,检查请求的服务器是否允许跨域!

Cors跨域解决

3、服务器响应允许跨域

服务器如果设置了允许跨域,服务器会在预检请求的响应头中添加允许跨域的信息!(这里我服务器已经编写了跨域配置)

Cors跨域解决

跨域信息解释: (1)Access-Control-Allow-Credentials: true 跨域请求默认不包含cookie,设置为true可以包含cookie (2)Access-Control-Allow-Headers: content-type, token 跨域请求暴露的字段 注意:CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。 (3)Access-Control-Allow-Methods: POST 支持哪些方法跨域 (4)Access-Control-Allow-Origin: http://localhost:8001 支持哪些来源的请求跨域 (5)Access-Control-Max-Age: 表明该响应的有效时间为多少秒。在有效时间内,浏览器无需为同一请求再次发起预检请求。注意,浏览器自身维护了一个最大有效时间,如果该首部字段的值超过了最大有效时间,将不会生效。

4、发送真实请求

这时会发送真实的登录login请求,包含自己的登录的用户密码等信息!

Cors跨域解决

Cors跨域解决

5、响应数据

服务器成功的响应数据,本次跨域成功!

Cors跨域解决

三、跨域解决方法

1、第一种:使用nginx部署为同一域(理念,这里没有具体实现)

例如A请求服务器B,A和B不在同一域下。可以使用nginx反向代理需要请求的服务器B,使A和nginx服务器在同一域下。A直接请求ngnix代理服务器就可以了,由nginx服务器转发到具体的服务器B。

2、第二种:配置当前请求允许跨域(服务器端配置过滤器)

这里创建的是springboot项目,在主启动类同级目录下创建一个config目录,在config目录下编写我们的跨域配置类GuLiCorsConfiguration,对所有的请求进行过滤!

目录截图:

Cors跨域解决

具体代码:

@Configuration
public class GuLiCorsConfiguration {
    @Bean
    public CorsWebFilter corsWebFilter(){
        //springboot自带的跨域过滤器所需要的跨域配置源
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();

        //跨域配置源需要的具体配置
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        //配置跨域
        corsConfiguration.addAllowedHeader("*");
        //支持哪些方法跨域
        corsConfiguration.addAllowedMethod("*");
        //支持哪些来源的请求跨域
        corsConfiguration.addAllowedOrigin("*");
        //允许携带cookie跨域
        corsConfiguration.setAllowCredentials(true);

        //对所有路径/**执行corsConfiguration配置
        corsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);

        return new CorsWebFilter(corsConfigurationSource);
    }
}

3、第三种:配置当前请求允许跨域(服务器端配置WebMvcConfigurer)

这里创建的是springboot项目,在主启动类同级目录下创建一个config目录,在config目录下编写我们的跨域配置类CorsConfig,对所有的请求进行跨域映射!

目录结构:

Cors跨域解决

具体代码:

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 设置允许跨域的路径
        registry.addMapping("/**")
                // 设置允许跨域请求的域名
            .allowedOrigins("*")
                // 是否允许证书
            .allowCredentials(true)
                // 设置允许的方法
            .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                // 设置允许的header属性
                .allowedHeaders("*")
                // 跨域允许时间
            .maxAge(3600);
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
芝士年糕 芝士年糕
1年前
什么是跨域
域: 是指浏览器不能执行其他网站的脚本跨域: 它是由浏览器的 同源策略 造成的,是浏览器对 JavaScript 实施的安全限制,所谓同源(即指在同一个域)就是两个页面具有相同的协议 protocol,主机 host 和端口号 port 则就会造成 
专注IP定位 专注IP定位
2年前
浅析九种跨域方式实现原理
我们在解决一个问题的时候应该先去了解这个问题是如何产生的,为什么会有跨域的存在呢?其实,最终的罪魁祸首都是浏览器的同源策略,浏览器的同源策略限制我们只能在相同的协议、IP地址、端口号相同,如果有任何一个不通,都不能相互的获取数据。并且,http和https之间也存在跨域,因为https一般采用的是443端口,http采用的是80端口或者其他。同源策略是一种约
Wesley13 Wesley13
2年前
Nginx解决跨域问题(CORS)
前言CORS(CrossOriginResourceSharing)跨域资源共享,是一种允许当前域(domain)的资源(比如html/js/webservice)被其他域(domain)的脚本请求访问的机制,通常由于同域安全策略(thesameoriginsecuritypolicy)浏览器会禁止这种跨域请求。 如:a.c
Wesley13 Wesley13
2年前
JAVA服务端配置允许跨域请求
CORS是一个W3C标准,全称是”跨域资源共享”(Crossoriginresourcesharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。1.加入CROS依赖的包<dependency<groupIdcom.thetransactionco
Easter79 Easter79
2年前
SpringBoot解决跨域问题
在开发前后端分离的项目时,常常会碰到跨域请求的问题。这是因为浏览器的安全性限制,不允许Ajax访问协议不同、域名不同、端口号不同的数据接口,否则会出报No'AccessControlAllowOrigin'headerispresentontherequestedresource错误。SpringBoot通过设置cors(跨源
Wesley13 Wesley13
2年前
JavaEE从服务器端解决Ajax跨域问题
1、Ajax跨域简介  1、指的是浏览器不能执行其他网站的脚本。是浏览器施加的安全限制。js本身不跨域,使用form表单和iframe直接请求,是不会跨域的;  2、只要两个url的协议、域名、端口其中有一个不同,从其中一个url中使用ajax请求另一个url,则属于Ajax跨域;  3、ajax请求接口,只是不能进入回调函数,接口还是可以正常请
Stella981 Stella981
2年前
SpringBoot解决跨域问题
在开发前后端分离的项目时,常常会碰到跨域请求的问题。这是因为浏览器的安全性限制,不允许Ajax访问协议不同、域名不同、端口号不同的数据接口,否则会出报No'AccessControlAllowOrigin'headerispresentontherequestedresource错误。SpringBoot通过设置cors(跨源
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
liam liam
7个月前
解决 Axios 跨域阻碍,提高前端接口访问效率
跨域是指访问另外一个域的资源,由于浏览器的同源策略,默认情况下使用XMLHttpRequest和Fetch请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略,这是由浏览器对施加的安全限制。Axios跨域常见报错跨域请求被阻止(CrossOriginRe
室与
室与
Lv1
遥想江口依然,鸟啼花谢,今日谁为主。
文章
1
粉丝
0
获赞
0
热门文章

暂无数据