解决:前端请求跨域问题

news2024/9/21 5:50:27

解决:前端请求跨域问题

    • 问题一:Access to XMLHttpRequest at 'https://xxx/ICN40310000075_1687926884828.pdf' from origin 'http://localhost:63342' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
    • 问题二:Access to XMLHttpRequest at 'http://127.0.0.1:8080/test8' from origin 'http://localhost:63342' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
  • 一·问题描述:
    • 1.一个下载文件的url接口,直接浏览器访问是可以正常下载文件,但是在页面里通过js发起XHR请求去访问下载文件接口,总是会报跨域问题,从而被浏览器拦截了请求
    • 2.控制台报错截图:如下所示
  • 二·问题原因:
    • 1.违反了浏览器的“同源协议”
    • 2.后台没有做相关的跨域处理
    • 3.浏览器直接访问第三方接口资源,是可以跳过“同源协议”的
  • 三·解决方案:
    • 方案一:遵循同源策略,不发起跨域请求,尽量在同一个服务里面试着解决业务需求。
    • 方案二:不遵循同源协议,发起不携带credentials凭证的跨域请求,那就只能在被访问的接口服务后台做允许跨域的处理才行;其实本质就是给接口加上一个响应头:Access-Control-Allow-Origin:*,适用于多系统或者多服务之间的接口对接场景
    • 方案三:不遵循同源协议,发起携带credentials凭证的跨域请求,那就只能在被访问的接口服务后台做允许跨域的处理才行;适用于多系统或者多服务之间的接口对接场景
  • 四·相关参考文章:
    • 1.什么是跨域,后端工程师如何处理跨域?

问题一:Access to XMLHttpRequest at ‘https://xxx/ICN40310000075_1687926884828.pdf’ from origin ‘http://localhost:63342’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

问题二:Access to XMLHttpRequest at ‘http://127.0.0.1:8080/test8’ from origin ‘http://localhost:63342’ has been blocked by CORS policy: The value of the ‘Access-Control-Allow-Origin’ header in the response must not be the wildcard ‘*’ when the request’s credentials mode is ‘include’. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

一·问题描述:

1.一个下载文件的url接口,直接浏览器访问是可以正常下载文件,但是在页面里通过js发起XHR请求去访问下载文件接口,总是会报跨域问题,从而被浏览器拦截了请求

2.控制台报错截图:如下所示

在这里插入图片描述

在这里插入图片描述

Access to XMLHttpRequest at ‘https://xxx/ICN40310000075_1687926884828.pdf’ from origin ‘http://localhost:63342’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
在这里插入图片描述
Access to XMLHttpRequest at ‘http://127.0.0.1:8080/test8’ from origin ‘http://localhost:63342’ has been blocked by CORS policy: The value of the ‘Access-Control-Allow-Origin’ header in the response must not be the wildcard ‘*’ when the request’s credentials mode is ‘include’. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
在这里插入图片描述

二·问题原因:

1.违反了浏览器的“同源协议”

什么是同源协议?
同源策略/SOP (Same origin policy)是一种约定,由 Netscape 公司1995年引入浏览器。

同源策略是指在 Web 浏览器中:
若某个网站的脚本(比如:js脚本)需要去访问另一个网站的相关资源;那这两个网站就必须同时满足下面三个条件才行,否则浏览器就会自动拦截脚本发起的相关请求:

1、协议相同;

2、域名相同;

3、端口相同;

2.后台没有做相关的跨域处理

3.浏览器直接访问第三方接口资源,是可以跳过“同源协议”的

三·解决方案:

方案一:遵循同源策略,不发起跨域请求,尽量在同一个服务里面试着解决业务需求。

方案二:不遵循同源协议,发起不携带credentials凭证的跨域请求,那就只能在被访问的接口服务后台做允许跨域的处理才行;其实本质就是给接口加上一个响应头:Access-Control-Allow-Origin:*,适用于多系统或者多服务之间的接口对接场景

前端发起不携带credentials凭证请求示例:

/**
     * 后台响应二进制流,前端接收处理并当作文件下载
     *
     * @param url 下载文件的接口url
     * @param data 接口必要的参数,json格式
     * @return
     * @author LiuMingFu
     * @date 2023-07-01
     */
    function downloadFile(url, data) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);     // 请求方式,看具体接口情况决定
        xhr.withCredentials = false; //不携带凭证,默认就是false
        xhr.responseType = "blob";  // 返回类型blob
        // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
        xhr.onload = function () {
            // 请求完成
            var blob = this.response;
            var downloadLink = document.createElement('a');
            let path = URL.createObjectURL(blob);
            console.log("path=" + path);
            downloadLink.href = path;
            downloadLink.download = 'hello.pdf'; // 替换为你想要的文件名和扩展名
            downloadLink.click();
            alert("下载完成");
        };
        xhr.onerror = function () {
            alert("下载失败")
        };
        // 发送ajax请求
        xhr.send(JSON.stringify(data)); // 数据格式,看具体接口情况决定
    }

后端接口处理示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setHeader("Access-Control-Allow-Origin", "*"); // 或者替换为具体的域名
    // 其他响应设置和处理
}

在Servlet的实现类中的doGet()或doPost()等方法中,添加上述代码即可设置Access-Control-Allow-Origin头。response对象提供了setHeader()方法,用于设置响应头的值。在实际应用中,为了安全考虑,应该将 * 通配符替换为具体的域名,以限制可访问资源的域。

注意:该方案是一般情况下,前端没有包含credentials凭证的跨域解决方案

方案三:不遵循同源协议,发起携带credentials凭证的跨域请求,那就只能在被访问的接口服务后台做允许跨域的处理才行;适用于多系统或者多服务之间的接口对接场景

前端发起携带凭证的跨域请求示例:

/**
     * 后台响应二进制流,前端接收处理并当作文件下载
     *
     * @param url 下载文件的接口url
     * @param data 接口必要的参数,json格式
     * @return
     * @author LiuMingFu
     * @date 2023-07-01
     */
    function downloadFile(url, data) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);     // 请求方式,看具体接口情况决定
        xhr.withCredentials = true; //携带凭证,默认是false
        xhr.responseType = "blob";  // 返回类型blob
        // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
        xhr.onload = function () {
            // 请求完成
            var blob = this.response;
            var downloadLink = document.createElement('a');
            let path = URL.createObjectURL(blob);
            console.log("path=" + path);
            downloadLink.href = path;
            downloadLink.download = 'hello.pdf'; // 替换为你想要的文件名和扩展名
            downloadLink.click();
            alert("下载完成");
        };
        xhr.onerror = function () {
            alert("下载失败")
        };
        // 发送ajax请求
        xhr.send(JSON.stringify(data)); // 数据格式,看具体接口情况决定
    }

后端服务接口代码处理示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String origin = request.getHeader("Origin");
    response.setHeader("Access-Control-Allow-Origin", origin);//具体的域名,不能使用*
    response.setHeader("Access-Control-Allow-Credentials", "true");
    // 其他响应设置和处理
}

在上述代码中,我们首先通过request.getHeader(“Origin”)获取到请求的来源域名,然后将其设置为Access-Control-Allow-Origin头的值,这里不能使用*号。同时设置Access-Control-Allow-Credentials为"true",允许携带凭证信息(即使跨域请求)。

这样设置以后,当使用withCredentials属性设置为true时,你的请求就可以成功通过CORS策略,包括携带相应的身份验证信息和cookie。

请记住,在生产环境中,应根据实际需求仔细控制和限制Access-Control-Allow-Origin头的值,仅允许来自特定域的跨域访问。

注意:要是在遵循同源协议的情况下,无论带不带credentials凭证,都是可以成功发起请求访问后台资源的

四·相关参考文章:

1.什么是跨域,后端工程师如何处理跨域?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

valgrind检测内存泄漏、越界访问、野指针访问实验

前言 本次测试包括&#xff0c;检测无误的代码&#xff0c;检测内存泄漏&#xff0c;检测访问越界&#xff0c;检测野指针&#xff0c;检测访问已经释放(已经被free)的内存。 一 安装valgrind sudo apt install valgrind 二 无错误 #include <stdio.h> #include <…

leetcode:836. 矩形重叠(python3解法)

难度&#xff1a;简单 矩形以列表 [x1, y1, x2, y2] 的形式表示&#xff0c;其中 (x1, y1) 为左下角的坐标&#xff0c;(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴&#xff0c;左右边平行于 y 轴。 如果相交的面积为 正 &#xff0c;则称两矩形重叠。需要明确的是&…

在图像上绘制图形

1.绘制直线 cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)2.绘制圆形 cv.circle(img, (256, 256), 60, (0, 0, 255), -1) 3.绘制矩形 cv.rectangle(img, (100, 100), (400, 400), (0, 255, 0), 5)4.向图片中添加文字 cv.putText(img, "hello", (100, 150), cv.F…

google浏览器如何把 develop tools 弹窗设置为一个单独界面

更改默认的弹出式窗口和重定向设置 在计算机上打开 Chrome。在右上角&#xff0c;依次点击“更多”图标 设置。依次点击隐私设置和安全性 网站设置 弹出式窗口和重定向。选择要设为默认设置的选项。 管理特定网站的弹出式窗口和重定向 https://support.google.com/ch…

自动备份Windows的环境变量

执行脚本 ECHO OFF set year%date:~6,4% set month%date:~0,2% set day%date:~3,2% set hour%time:~0,2% set minute%time:~3,2% set second%time:~6,2% set backupTime%year%%month%%day%_%hour%%minute%%second% set>>D:/IDE/databack/pc_path/environment-backup-%ba…

【若依项目学习】day1-启动项目

若依开源框架&#xff0c;前后端分离项目&#xff0c;地址&#xff1a;http://doc.ruoyi.vip/ruoyi-vue/ 先配置环境 JDK1.8&#xff0c; MySQL5.7 &#xff0c;Maven3.6&#xff0c;redis、nginx(可以不配)、 node 具体见&#xff1a;https://ygstriver.blog.csdn.net/articl…

windows——【磁盘】C盘又又双叒叕满了,如何清理爆满的C盘

目录 磁盘又满了&#xff0c;咋整&#xff1f;1.初级版本&#xff0c;用windows自带清理工具【没啥用】2.控制面板&#xff0c;清理系统和保留空间【亲测有用】&#xff08;1&#xff09;在控制面板里面点击系统&#xff08;2&#xff09;在系统里面右键 3.直接删除C盘的文件&a…

家政软件是什么,上门预约家政软件有什么功能?

随着人们生活水平的提高和对便利性的需求增加&#xff0c;家政服务市场正呈现出快速增长的趋势。家政软件作为提供便捷、高效家政服务的工具&#xff0c;将成为满足用户需求的重要方式。这将推动家政软件市场的扩大。那么家政软件具体是什么样的一款软件呢&#xff1f; 家政上门…

额度系统,为什么需要有【预占额度】这个操作?

反向思维&#xff0c;若没有额度预占&#xff0c;系统会有什么问题&#xff1f; 没有额度预占 我们知道&#xff0c;额度预占、额度扣减是搭配调用的。这个流程&#xff0c;是在授信完支用期间的&#xff0c;流程如下图&#xff1a; 额度扣减&#xff1a; 核心建立借据成功&…

Vue3+TS+ElementPlus报错集锦

目录 1、导入TS类型报错 2、使用类型报错 3、Vue3引入文件爆红且不提示 4、为defineAsyncComponent引入的component子组件设置类型 5、类型“undefined”不能作为索引类型使用。 6、为props定义类型报错 7、在tsx中调用表单验证方法报错 8、为defineComponent中的props选…

1_5 Occupancy network

1、BEVerse: Unified Perception and Prediction in Birds-Eye-View for Vision-Centric Autonomous Driving 本文不想已经存在的单一任务优化方法&#xff0c;而是构建BEV的时空视频特征并联合推断视觉自动驾驶多任务。之前的任务是目标检测和地图语义分割一起做&#xff0c;之…

量子力学的起源和基本概念

亲爱的读者&#xff0c; 欢迎回到我们的量子力学系列文章。在我们的第一篇文章中&#xff0c;我们进行了量子力学的总体介绍。今天&#xff0c;我们将深入探讨量子力学的起源和一些基本概念。 量子力学的起源可以追溯到20世纪初&#xff0c;当时的科学家们遇到了一些古典物理…

stm32 + w25qxx + EasyFlash

一&#xff0c;软件介绍 EasyFlash 是一款开源的轻量级嵌入式Flash存储器库&#xff0c;方便实现基于Flash存储器的常见应用开发。适合智能家居、可穿戴、工控、医疗等需要断电存储功能的产品&#xff0c;资源占用低&#xff0c;支持各种 MCU 片上存储器。 [1] 该库目前提供…

CrossOver软件Mac2023下载安装教程

CrossOver是一款可以让Mac和Linux系统中正常运行Windows软件的应用程序。它不像虚拟机一样需要安装Windows系统之后才可以安装Windows的应用程序&#xff0c;这一方式给大多数用户带来了方便。通过CrossOver实现跨平台的文件复制粘贴&#xff0c;使Mac/Linux系统与Windows应用良…

数字图像处理1-概述

目录 一、数字图像与数字图像处理 1. 基本概念 1.1 处理方法通常有: 1.2 图像处理的基本特征∶ 2. 图像处理与图像分析的关系 3. 数字图像处理的优点 二、数字图像处理系统组成及研究内容 1.数字图像处理系统的组成 1.1 基本图象处理系统的结构 1.2 图像输入设备 1.3 扫描仪分…

leetcode 26.删除有序数组中的重复项

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;删除有序数组中的重复项 代码&#xff1a; /*思路&#xff1a;双指针问题[1,1,2]src-> [ 1 , 1 , 2 ]destnums[src] nums[dest] > src;src-> [ 1 , 1 , 2 ]destnums[src]…

volatile和-O3测试

一个延时函数&#xff1a; #include <stdio.h> #include <stdlib.h> #include <time.h> void delay(){int i 0;int j 0;for(i 0;i < 50000;i){for(j 0;j < 50000;j);} }int main(int argc, char **argv){printf("time %ld\n",time(NUL…

碳排放预测模型 | Python实现基于机器学习的碳排放预测模型(模型对比)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于机器学习的碳排放预测模型(模型对比) 碳排放被认为是全球变暖的最主要原因之一。 该项目旨在提供各国碳排放未来趋势的概述以及未来十年的全球趋势预测。 其方法是分析这些国家各…

供应链管理-亿发供应链计划管理系统,赋能中小型制造企业信息化

供应链管理是现代企业成功的关键因素。中小型制造企业可以通过建立有效的供应链管理系统实现成本控制、增加交付速度、增强灵活度&#xff0c;增加客户满意度。供应链管理系统&#xff0c;利用物联网技术工具来实现中小型企业供应链自动化和优化。减少人为错误&#xff0c;增加…

30_小驰私房菜_qcom根据关键日志信息,快速排查问题

根据关键日志信息,能帮忙我们快速的定位和分析问题。是一项必须得掌握的技能。 一、查看当前是哪个app调用的相机 logcat 关键字“CameraService::connect” 如下面日志打印所示,我们还可以看到是调用的Camera API 1还是Camera API 2. 二、查看配流情况 1) qcom 平台 …