相关文章推荐
玩足球的人字拖  ·  如何在Vue组件中调用封装好的外部js文件方 ...·  10 月前    · 
活泼的企鹅  ·  使用复选框将粘贴转到目标范围使用Google ...·  2 年前    · 
高大的楼房  ·  opencv提取白色区域面积-掘金·  2 年前    · 
Code  ›  解决xxx by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the requested resource问题-天翼云
https://www.ctyun.cn/zhishi/p-249574
千杯不醉的路灯
2 年前

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 618翼购节 HOT S2云主机1核2G只要33.9元起/3个月
  • 算力套餐 NEW 让算力触手可及
  • 云上钜惠 HOT 限制抢购 爆款云主机畅享3个月只要33元起!
  • 中小企业上云场景组合购 NEW 建站、域名等场景一站式购齐,组合购9元起!
  • 天翼云·创新直播间 NEW 与专家共同解读云计算领域前沿趋势
  • 新客特惠 NEW 热销云主机秒杀低至1折!
  • 天翼云电脑专场 HOT 移动办公神器天翼云电脑4核8G畅享3个月只要130元起!
  • 云主机特惠 HOT 新老同享云主机2.5折起,升级高性能云主机更划算!
免费活动
  • 企业免费试用专区 HOT 数十款产品免费试用,完成企业实名认证领取2000元试用金!
  • 个人免费试用专区 HOT 完成个人实名认证即可获得1000元试用金!
  • 新客特惠 爆款云主机1折起
  • 云上安全专场 安全产品全场6折起!

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务。
进入甄选商城 进入云市场
办公协同
  • WPS云文档天翼云版 翼企云( License版) 天翼云企业云盘(标准服务版) 蓝信安全移动工作平台(SAAS) SSL证书 新域名服务 税务风控云 商企云财税(SAAS版) 翼云加速-标准版包月套餐 天翼云管家2.0 天翼云管家 翼备份(SaaS版)300G 智慧工厂_生产流程管理解决方案 天翼智慧工地 天翼全栈混合云敏捷版(软件) 天翼全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云技术合作伙伴
  • 天翼云OpenAPI中心 天翼云诸葛AI平台 天翼云EasyCoding平台
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云培训认证
  • 天翼云学堂 天翼云市场商学院
天翼云服务合作伙伴
  • 天翼云MSP合作伙伴
天翼云合作计划
  • 央企云合作计划
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴 天翼云甄选商城合作伙伴

开发者

开发者相关功能入口汇聚
技术社区
资源与工具
  • 天翼云OpenAPI EasyCoding敏捷开发平台 AI创作间
培训与认证
  • 天翼云学堂 天翼云认证

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • OpenAPI中心 客户支持计划

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云 天翼云4.0 天翼云APP 全球基础设施 分析师和白皮书 2023云生态大会 2022云生态大会 天翼云中国行 支持与服务 了解天翼云
  • 站点切换
    • 中国站
  • 文档
  • 控制中心
  • 备案
  • 管理中心

解决xxx by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the requested resource问题

首页 知识中心 其他 文章详情页

解决xxx by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the requested resource问题

2023-07-11 08:48:36 阅读次数:2

ajax, javascript

今天登录ant design pro时,报出登录失败的问题,于是打开控制台,如下图所示:

错误信息为 Access to XMLHttpRequest at 'http://127.0.0.1:8088/user/login' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

翻译成中文是 从源“http://127.0.0.1:8000”访问“http://127.0.0.1:8088/user/login”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查 :请求的资源上不存在“Access-Control-Allow-Origin”标头。

这个问题简单来说即是跨域问题,但为什么会存在跨域问题呢?

跨域报错的原因: 请求是跨域的,并不一定会报错。普通的图片请求,css文件请求是不会报错的

跨域请求出现错误的条件: 浏览器 同源策略 && 请求是ajax类型

什么是跨域

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

比如,为了满足从域名A下的一个页面(一般ajax或CORS请求等)获取域名B下的一个资源,但是浏览器的 同源策略 的限制默认并不允许这样的事情发生,所以需要跨域。

为什么要跨域

有一些情况下,我们是需要跨域访问的。比如,程序员开发网站,就有可能需要在本地访问服务器的数据。再比如某公司的A页面( a.superjson.com )有可能需要获取B页面( b.superjson.com )。

什么是同源策略

上文提到了同源策略,那什么是同源策略呢?

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。同源策略是一种关键的安全机制,它限制一个源加载的文档或脚本如何与另一个源的资源进行交互。

同源策略要求 协议(protocol)、域名(host)、端口号(port) ,都必须相同,其中一个不同都会产生跨域。比如, http://www.superjson.com:8000/ 中的协议是http、主域名是superjson、子域名是www、端口号是8000。

以URL1和URL2为例子,来说明是否为同源:

为何存在同源策略

假如,你刚刚在网银输入账号密码,查看了自己还有1万块钱,紧接着访问一些不规矩的网站,这个网站可以访问刚刚的网银站点,并且获取账号密码,那后果可想而知。

所以,从安全的角度来讲,同源策略是有利于保护网站信息的。

解决跨域问题

我后端使用的是 spring boot 框架,所以,我可以配置如下代码:

package com.superjson.superjsonmanager.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import static com.superjson.superjsonmanager.constants.CorsConfigConstant.*;
 * @author 念兮为美
 * @datetime 2022/8/5 22:32
 * @desc 解决跨域的过滤器
@Configuration
public class CorsConfig implements WebMvcConfigurer {
  @Override
  public void addCorsMappings(CorsRegistry registry) {
    // 添加映射路径
    registry
        .addMapping(ADD_MAPPING)
        // 是否发送Cookie
        .allowCredentials(ALLOW_CREDENTIALS)
        // 设置放行哪些原始域   SpringBoot2.4.4下低版本使用.allowedOrigins("*")
        .allowedOriginPatterns(ALLOWED_ORIGIN_PATTERNS)
        // 放行哪些请求方式
        .allowedMethods(
            new String[] {
              ALLOWED_METHODS_GET, ALLOWED_METHODS_POST, ALLOWED_METHODS_PUT, ALLOWED_METHODS_DELETE
        // 或者放行全部
        .allowedMethods(ALLOW_ALL)
        // 放行哪些原始请求头部信息
        .allowedHeaders(ALLOW_ALL)
        // 暴露哪些原始请求头部信息
        .exposedHeaders(ALLOW_ALL);
package com.superjson.superjsonmanager.constants;
 * @author 念兮为美
 * @datetime 2022/8/9 09:13
 * @desc 设置解决跨域问题的常量
public class CorsConfigConstant {
  public static final String ADD_MAPPING = "/**";
  public static final boolean ALLOW_CREDENTIALS = true;
   * 配置允许访问的域名
   *   <li>https://*.domain1.com -- 以domain1.com域名结尾
   *   <li>https://*.domain1.com:[8080,8081] -- 以domain1.com结尾的端口号为8080或8081
   *   <li>https://*.domain1.com:[*] -- 以domain1.com结尾的任意端口号
   * </ul>
  public static final String ALLOWED_ORIGIN_PATTERNS = "http://127.0.0.1:[8000,1234]";
  public static final String ALLOWED_METHODS_GET = "GET";
  public static final String ALLOWED_METHODS_POST = "POST";
  public static final String ALLOWED_METHODS_PUT = "PUT";
  public static final String ALLOWED_METHODS_DELETE = "DELETE";
  public static final String ALLOW_ALL = "*";

其他解决跨域问题的方案

JSONP

原理是:有些标签 script、img、link、iframe ... 这些标签不存在跨域请求的限制,就是利用这个特点解决跨域问题。

JSONP 是服务器与客户端跨源通信的常用方法:

  • 优点:简单适用,兼容性好(可以兼容低版本IE),
  • 缺点:只支持 get 请求,不支持 post 请求,导致数据不安全
  • 核心思想:网页通过添加一个 <script> 元素,向服务器请求JSON数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。

  • 原生实现(JSONP 需要服务端的支持)
  • <script src='http://www.superjson.com/data?callback=func'></script>
    <!-- 向服务器 www.superjson.com 发出请求,该请求的查询字符串有一个 callback 参数,用来指定回调函数的名字 -->
    <!-- 给客户端返回数据 "func('+JSON.stringify(data)+')" ,浏览器把字符串变成 js 表达式执行 -->
    
    
    
    
        
    
    <!-- func 需要是一个全局函数 -->
    <script type='text/javascript'>
      function func(res){
        // 处理获得的数据
    </script>
    
  • jQuery提供的JSONP处理方式
  • $.ajax({
      url: 'http:/www.superjson.com:8000/login',
      type: 'get',
      dataType: 'jsonp',// 设置请求方式为 jsonp
      jsonpCallback: 'handleCallback',// 自定义回调函数名 
      data: {}
    
  • Vue.js
  • this.$http.jsonp('http://www.superjson.com:8080/login', {
      	params: {},
        jsonp: 'handleCallback'
      }).then(res => {
    });
    

    CORS 跨域资源共享

    CORS 跨域资源共享,即Cross-Origin Resource Sharing。它新增的一组 HTTP 首部字段允许服务器其声明那些来源请求有权访问哪些资源,就是它允许浏览器向其声明了 CORS 的栈进行跨域请求。

    这种方式最主要的特点就是会在响应的 HTTP 首部增加 Access-Control-Allow-Origin 等信息,从而判定那些资源站可以进行跨域请求,还有几个其他相关的 HTTP 首部进行更加精细化的控制,最主要的还是 Access-Control-Allow-Origin 。

    CORS 与 JSONP 对比来说又是比较明显,JSONP 只支持 GET 方式,而且 JSONP 并不符合处理业务的正常流程。采用 CORS 的方式,前端编码与正常非跨域请求没有什么不同。

  • 客户端发送请求(ajax):
  • 在真正的发送跨域请求之前会发送一个试探性请求(OPTIONS),服务器接收到 OPTIONS请求之后,做一个处理,返回成功,表示可以发送跨域请求,再发送真正的跨域请求

    服务端设置相关的头信息(需要处理试探性请求OPTIONS)

  • 带 cookie 跨域请求:前后端都需要进行设置
  • 根据 xhr.withCredentials 字段判断是否带有 cookie

  • 原生 ajax
  • var xhr = new XMLHttpRequest();// ie8/9 需用 window.XDomainRequest 兼容
    // 前端设置是否带 cookie
    xhr.withCredentials = true;
    xhr.open('post', 'http://www.superjson.com:8000/index', true);
    xhr.setRequestHeader('Content-ype', 'application/x-www-form-urlencoded');
    xhr.send('user=admin');
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4 && xhr.status == 200) {
        alert(xhr.responseText)
    
  • 原生 ajax
  • $.ajax({
      url: 'http://www.superjson.com:8000/index',
      type: 'get',
      data: {},
      xhrFields: {
        withCredentials: true// 设置前端是否带 cookie
      crossDomain: true// 会让请求头中包含跨域的额外信息,但不会含 cookie
    });
    
  • vue-resource
  • Vue.http.options.credentials = true
    
  • axios
  • axios.defaults.withCredentials = true
    

    服务器设置

    服务器端对于 CORS 的支持,主要是通过设置 Access-Control-Allow-Origin 来进行的。如果浏览器检测到相应的设置,就可以允许 Ajax 进行跨域访问:

    // 不使用*,自动适配跨域域名,避免携带Cookie时失效
    String origin = request.getHeader('Origin');
    if (StringUtils.isNotBlank(origin)) {
      response.setHeader('Access-Control-Allow-Origin', origin);
    // 自适应所有自定义头
    String headers = request.getHeader('Access-Control-Request-Headers');
    if (StringUtils.isNotBlank(headers)) {
      response.setHeader('Access-Control-Allow-Headers', headers);
      response.setHeader('Access-Control-Expose-Headers', headers);
    // 允许跨域的请求方法类型
    response.setHeader('Access-Control-Allow-Methods', '*');
    // 预检命令(OPTIONS)缓存时间,单位:秒
    response.setHeader('Access-Control-Max-Age', '3600');
    // 明确许可客户端发送Cookie,不允许删除字段即可
    response.setHeader('Access-Control-Allow-Credentials', 'true');
    

    既然不能跨域请求,那么我们不跨域就可以了,通过在请求到达服务器前部署一个服务,将接口请求进行转发,这就是反向代理。通过一定的转发规则可以将前端的请求转发到其他的服务。

    通过反向代理我们将前后端项目统一通过反向代理来提供对外的服务,这样在前端看上去就跟不存在跨域一样。

    反向代理麻烦之处就在原对Nginx等反向代理服务的配置,在目前前后端分离的项目中很多都是采用这种方式。

    proxyTable: {
       '/api': {
         target:'http://api.douban.com/v2', // 你请求的第三方接口
         changeOrigin:true, // 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
         pathRewrite:{  // 路径重写,
           '^/api': ''  // 替换target中的请求地址,也就是说以后你在请求http://api.douban.com/v2/XXXXX这个地址的时候直接写成/api即可。
    
  • http://www.manongjc.com/detail/29-cpaozffgzyhvbjc.html
  • 版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/lvoelife/article/details/126244103,作者:互联网全栈开发实战,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

    上一篇: 解决 No active profile set, falling back to 1 default profile: “default“问题以及如何查看spring boot版本号

    下一篇: 怎么让 echarts 图表动起来?定时器解决它 —— 大屏展示案例(动态仪表盘、动态柱状图)

    相关文章

    2023-7-13

    记录使用Node.js下载zip文件但由于IDM的干扰不能正常下载的问题

    记录使用Node.js下载zip文件但由于IDM的干扰不能正常下载的问题

    javascript
    2023-7-20

    mvc 中使用jquery ajax与action传值

    步骤: 0.html: 1.使用json数据形式 2.直接传字符串:

    jquery string
    2023-7-19

    JavaScript-instanceof关键字

    什么是 instanceof 关键字​​instanceof​​​ 用于判断 ​​"对象"​​ 是否是指定构造函数的 "实例"。先来看如下这一段代码,利用 instanceof 关键字来看看结果。运行结果如上

    javascript
    2023-7-13

    全网最详细的js判断字符串包含某个字符串的多种方法,比如search(),includes(),indexOf(),lastIndexOf()等

    全网最详细的js判断字符串包含某个字符串的多种方法,比如search(),includes(),indexOf(),lastIndexOf()等

    javascript
    2023-7-13

    解决npm ERR! Cannot read properties of null (reading ‘pickAlgorithm‘)

    解决npm ERR! Cannot read properties of null (reading ‘pickAlgorithm‘)

    javascript
    2023-7-13

    JavaScript对象的属性描述符(Property Descriptor)介绍

    JavaScript对象的属性描述符(Property Descriptor)介绍 JavaScript 中的对象(Object)是一个

    javascript Object
    2023-7-13

    全网最详细的less教程(为什么使用less和less的语法)以及 解决css的兼容性问题,并解决NameError: variable ## is undefined的问题

    全网最详细的less教程(为什么使用less和less的语法)以及 解决css的兼容性问题,并解决NameError: variable ## is undefined的问题

    javascript
    2023-7-17

    JavaScript-工厂函数

    什么是工厂函数工厂函数就是专门用于创建对象的函数, 我们就称之为工厂函数例如如下的代码,通过观察发现都是创建对象。接下来我通过工厂函数的方式来改造一下上方的代码之后,你在看看两者之间的区别,你就可以发现工厂函数的优点,代码如下。

    javascript
    2023-7-17

    JavaScript变量

    什么是变量变量表示一些​​可以被修改​​的数据在现实生活中超市的储物格就是变量, 在不同的时间段里面, 储物格中存储的数据也不一样定义一个变量在JavaScript中可以通过定义变量的方式来生成储物格, 也就是告诉浏览器, 我们需要一块内存

    javascript
    2023-7-17

    JavaScript-原型链

    对象中 ​​__proto__​​ 组成的链条我们称之为原型链对象在查找属性和方法的时候,会先在当前对象查找如果当前对象中找不到想要的,会依次去上一级原型对象中查找如果找到 ​​Object​​ 原型对象都没有找到,就会报错

    javascript

    作者介绍

    天翼云小翼
    天翼云用户

    文章

    23251

    阅读量

    1032547

    查看更多

    最新文章

    mvc 中使用jquery ajax与action传值

    2023-7-20

    解决npm ERR! Cannot read properties of null (reading ‘pickAlgorithm‘)

    2023-7-13

    全网最详细的less教程(为什么使用less和less的语法)以及 解决css的兼容性问题,并解决NameError: variable ## is undefined的问题

    2023-7-13

    解决Eclipse使用Genymotion出现INSTALL_FAILED_CPU_ABI_INCOMPATIBLE问题

    2023-7-5

    完美地解决Error: Cannot find module ‘...\\AnotherRedisDesktopManager\\node_modules\\fs.realpath\\index.js‘的问题

    2023-7-9

    jQuery(五)Ajax、跨域

    2023-7-9

    查看更多

    热门文章

    Jsp Ajax之模拟用户注册

    2022-11-9

    js: 在chrome中实现复制到剪贴板

    2023-2-20

    Node.js:axios自定义headers请求头

    2022-11-8

    中秋不加班:js枚举值enums在业务中的应用案例

    2022-11-8

    js:运行设备环境类型判断

    2022-11-8

    js: json的序列化和反序列化

    2023-2-20

    查看更多

    热门标签

    linux python docker Linux javascript spring kubernetes elasticsearch github centos maven
    查看更多

    相关产品

    弹性云主机

    随时自助获取、弹性伸缩的云服务器资源

    天翼云电脑(公众版)

    便捷、安全、高效的云电脑服务

    对象存储

    高品质、低成本的云上存储服务

    云硬盘

    为云上计算资源提供持久性块存储

    查看更多

    随机文章

    javascript-索引

    React工作55:ant design spin

    Vue(十)vuex

    前端工作小结90-splice

    jquery中的ajax 网络请求

    解决Eclipse使用Genymotion出现INSTALL_FAILED_CPU_ABI_INCOMPATIBLE问题

    推荐助力领好礼 邀请好友完成推荐任务 最高可得千元电信卡
    查看详情
    • 7*24小时售后
    • 无忧退款
    • 免费备案
    • 专家服务
    售前咨询热线
    400-810-9889转1
    • 天翼云APP 微信公众号
    服务与支持
    • 备案中心
    • 售前咨询
    • 智能客服
    • 自助服务
    • 工单管理
    • 客户公告
    账户管理
    • 管理中心
    • 订单管理
    • 余额管理
    • 发票管理
    • 充值汇款
    • 续费管理
    快速入口
    • 文档中心
    • 最新活动
    • 免费试用
    • 安全专区
    • 信任中心
    • 天翼云学堂
    云网生态
    • 甄选商城
    • 渠道合作
    • 云市场合作
    了解天翼云
    • 关于天翼云
    • 天翼云APP
    • 服务案例
    • 新闻资讯
    • 联系我们
    • 校园招聘
    热门产品
    • 弹性云主机
    • 边缘安全加速平台
    • 天翼云电脑
    • 天翼云手机
    • 关系型数据库
    • 对象存储
    • 云硬盘
    • Web应用防火墙
    • 服务器安全卫士
    • 天翼云办公
    热门推荐
    • 云服务备份
    • 云空间
    • 全站加速
    • 安全加速
    • 超融合服务-iStack
    • 智能边缘云
    • 应用编排服务
    • 微服务引擎
    • 共享流量包
    更多推荐
    • web应用防火墙
    • 密钥管理
    • 等保咨询
    • 安全专区
    • 应用运维管理
    • 云日志服务
    • 云网融合
    • 云搜索服务
    • 数据湖探索
    • 数据仓库服务
    友情链接
    • 天翼云盘
    • 天翼企业云盘
    • 189邮箱
    • 中国电信集团
    ©2023 京ICP备 2021034386号
     
    推荐文章
    玩足球的人字拖  ·  如何在Vue组件中调用封装好的外部js文件方法-天翼云
    10 月前
    活泼的企鹅  ·  使用复选框将粘贴转到目标范围使用Google-腾讯云开发者社区-腾讯云
    2 年前
    高大的楼房  ·  opencv提取白色区域面积-掘金
    2 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    Code - 代码工具平台
    © 2024 ~ 沪ICP备11025650号