跨域问题及解决方式(CORS)

  • 1. 背景
  • 2. 什么是跨域?
  • 3. 非同源限制
  • 4. 跨域解决方案
    • 4.1 cors
    • 4.2 nginx
    • 4.2 其他方式

1. 背景

项目中在用图片验证码,项目重启后发现验证码无法正常使用,这让我很是头疼,刚才还好好的,咋重启了一下就没法用了。打开F12 后发现是 如下图:

当时第一想法就是需要在项目配置跨域,在排查项目过程中发现有跨域的相关配置。但是后续还是没有反应过来是IP没对上导致的,后来将localhost 换成127.0.01 后解决的。特在此写一篇博客来进行记录。

2. 什么是跨域?

跨域是指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。

例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问,其实是浏览器的限制。理解这一点很重要!!!

同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域;[原文][1]

当一个请求url的协议域名端口三者之间任意一个与当前页面url不同即为跨域

当前页面url 当前页面url 是否跨域 原因
http://www.test.com/ http://www.test.com/index.html 同源(协议、域名、端口号相同)
http://www.test.com/ https://www.test.com/ 跨域 协议不同(http/https)
http://www.test.com/ http://www.baidu.com/ 跨域 主域名不同(test/baidu)
http://www.test.com/ http://blog.test.com/ 跨域 子域名不同(www/blog)
http://www.test.com:8080/ http://www.test.com:7001/ 跨域 端口号不同(8080/7001)

3. 非同源限制

  • 无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB
  • 无法接触非同源网页的 DOM
  • 法向非同源地址发送 AJAX 请求

4. 跨域解决方案

4.1 cors

跨源资源共享 (CORS)(或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),这样浏览器可以访问加载这些资源。现代浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch)使用 CORS,以降低跨源 HTTP 请求所带来的风险。

  • 普通跨域请求:只需服务器端设置Access-Control-Allow-Origin
  • 带cookie跨域请求:前后端都需要进行设置

前端vue

  • vue-resource

      Vue.http.options.credentials = true
    
  • vue-resource

      Vue.http.options.credentials = true
    

后端Spring

  • 全局配置适配器
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")//针对header单独设置,不然无法获取header中的请求信息,前端也无法拿到响应中的                   // header信息,OPTIONS请求也会经过拦截器,在进行登录拦截时候要注意特殊处理.allowedHeaders("*").exposedHeaders("access-control-allow-headers","access-control-allow-methods","access-control-allow-origin","access-control-max-age","X-Frame-Options")// 表明在3600秒内,不需要再发送预检验请求,可以缓存该结果.maxAge(3600).allowCredentials(true);}
}
  • 全局过滤器
    通过实现Fiter接口在请求中添加一些Header来解决跨域的问题
@Component
public class CorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletResponse res = (HttpServletResponse) response;res.addHeader("Access-Control-Allow-Credentials", "true");res.addHeader("Access-Control-Allow-Origin", "*");res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {response.getWriter().println("ok");return;}chain.doFilter(request, response);}@Overridepublic void destroy() {}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}
}

4.2 nginx

使用 nginx 反向代理实现跨域,是最简单的跨域方式。只需要修改 nginx 的配置即可解决跨域问题,支持所有浏览器,支持 session,不需要修改任何代码,并且不会影响服务器性能。

我们只需要配置nginx,在一个服务器上配置多个前缀来转发http/https请求到多个真实的服务器即可。这样,这个服务器上所有url都是相同的域 名、协议和端口。因此,对于浏览器来说,这些url都是同源的,没有跨域限制。而实际上,这些url实际上由物理服务器提供服务。这些服务器内的 javascript可以跨域调用所有这些服务器上的url。

4.2 其他方式

在实际开工作中CORS 较为常见,但是也有其他的解决方式。 请参考:什么是跨域?跨域解决方法

【注】:上述如有问题,请不吝赐教,如有侵权,请及时联系进行删除

参考地址:
什么是跨域?跨域解决方法
什么是跨域?如何解决?【注 nginx 如何实现】
10种跨域解决方案(附终极大招)
跨源资源共享(CORS)【注:外文翻译】

跨域问题及解决方式(CORS)相关推荐

  1. Spring Boot 2.x 跨域问题(多种解决方式)

    参考:https://juejin.im/post/5d438becf265da03de3ae29f 什么是跨域 首先,我们需要了解一下一个URL是怎么组成的: // 协议 + 域名(子域名 + 主域 ...

  2. 什么是跨域?怎么解决跨域

    什么是跨域 同源策略(SOP: Same Origin Policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到X ...

  3. SpringBoot解决跨域的5种方式

    本文来说下SpringBoot中实现跨域的5种方式. 文章目录 什么是跨域 java解决CORS跨域请求的方式 返回新的CorsFilter(全局跨域) 重写WebMvcConfigurer(全局跨域 ...

  4. springboot项目解决跨域的几种方式

    跨域资源共享(CORS):通过修改Http协议header的方式,实现跨域.说的简单点就是,通过设置HTTP的响应头信息,告知浏览器哪些情况在不符合同源策略的条件下也可以跨域访问,浏览器通过解析Htt ...

  5. 解决Vue前后端跨域问题的多种方式

    1 前言 本文主要介绍借助解决Vue前后端跨域问题的几种方式 说到ajax请求,就不得不说下xhr(XMLHttpRequest)了,它可以说是鼻祖,但是实际开发中,我们不会直接使用它,而是进行二次封 ...

  6. 【前端44_前后端交互_跨域】前端解决:JSONP、后端解决:CORS 、后端代理

    文章目录 跨域 什么是跨域 前端解决: JSONP 实现原理 步骤 前端:创建标签,拼接传递参数 后端:接收值,返回值 封装 Ajax 代码 在封装的 Ajax 中添加 JSONP 需求 思路 练习: ...

  7. 什么是同源策略及解决跨域的三种方式

    同源策略 1.1.1 所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源.同源策略/SOP(Same origin policy)是一种约 ...

  8. 跨域以及一些解决方法

    跨域 最近在回顾一些知识,归纳一下以前的笔记再结合各个资料说一下我对跨域和跨域问题的解决方法. 产生跨域安全问题不是后台服务器不允许前台调用, 其本质是浏览器的同源策略(Same-origin pol ...

  9. vue php跨域,Vue 项目中遇到的跨域问题及解决方法(后台php)

    问题描述 前端 vue 框架,后台 php,百度跨域问题后台加这段代码 header("Access-Control-Allow-Origin: *"); 加了之后报这个错: Th ...

最新文章

  1. 图论 ---- Tajran找割点 牛客多校2021 J Defend Your Country
  2. tomcat出现5个using_出现急性心梗,要当心5个并发症,一个都不好惹!
  3. excel取整函数_Excel中的这些烧脑问题,你遇到过几种?
  4. VC2010 [转]解决char *无法转换为LPCWSTR问题
  5. where is SAP CRM One Order event callback registered
  6. Java中获得了方法名称的字符串,怎么样调用该方法
  7. mysql数据库持续_MySql数据库--持续记录ing
  8. 自定义spring配置文件位置
  9. c并非所有的代码路径都返回值_两行C语言代码播放音乐,就这么so easy!你学到了吗?...
  10. 过几天就退休了,目前情况下可不可以请同事们吃饭呢?
  11. android5.0百度地图,百度地图安卓版5.0.0 官方版
  12. 菲尼克斯电源模块UNO-PS1AC24DC100W的组装
  13. 32、T5L 迪文屏 C51开发之数据存储模型
  14. html实现银行卡号输入,Vue中Element-ui 输入银行账号每四位加一个空格的实现代码_飛雲_前端开发者...
  15. LMS算法实现系统识别
  16. 情人节程序员用HTML网页表白【超具创意的网页生日快乐】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  17. BLS 签名和基于 BLS 签名的门限签名
  18. 叉积 微分 恒等式_最美的公式:你也能懂的麦克斯韦方程组(微分篇)(下)...
  19. 网站接入银联网上支付(B2B)
  20. 技术分享 | 浅谈滴滴派单算法

热门文章

  1. 字节转换比特位c语言,C语言实现双字节在数组中按比特位移动
  2. 函数:写一函数求sinh(x)的值,求sinh(x)的近似公式为: sinh(x) = (ex-e-x)/2 其中用一个函数求ex
  3. 客户机 服务器系统的特点是客户机和服务器,客户机 服务器数据库系统的特点...
  4. robcad和catia是什么关系_[科普] | 不认识CATIA?没关系,至少和它兄弟熟吧!
  5. 使用mt管理器访问iis创建的ftp站点
  6. 福建省计算机三级偏硬,计算机三级偏硬试题10.doc
  7. 反计算机病毒技术论文,反计算机病毒技术的教学设计-计算机病毒论文-计算机论文(9页)-原创力文档...
  8. 工具学习——Linux Read-only file system NTFS
  9. win10怎么设置外接摄像头_win10系统外接摄像头不能用的解决方法
  10. 《滚石》评出最伟大100首英文歌