PDF.js CORS 问题

问题概要

我从域 A 将 PDF.js 加载到 iframe 中,并以文件作为参数(服务器的完整路径,这将返回 pdf 文档)。PDF.js 将向域 B 的服务器创建一个请求,扩展名为origin: domain A. 域 B 的服务器返回带有 header 的 pdf 文档Access-Control-Allow-Origin: domain A,到目前为止一切顺利。

在我的网络选项卡中,我看到对服务器的请求,该请求返回 200 状态 OK,但 PDF.js 抛出错误Unexpected server response (0) while retrieving PDF <url>。

问题是,这里发生了什么,CORS 似乎没问题,但我无法从 PDF.js 获得更多信息,真正的原因是 PDF 无法加载。有没有人遇到过同样的情况?

问题解决

跨域Ajax与跨源资源共享

几年前,Web 开发人员正在用头撞 Ajax 的第一堵墙:同源策略。虽然我们惊叹于跨浏览器支持所带来的巨大进步XMLHttpRequest对象,我们很快就抱怨没有办法从 JavaScript 向不同的域发出请求。每个人都在自己的网站上设置代理,这是一系列新的开放重定向问题的开始,作为绕过限制的一种方法。尽管开发人员正在使用服务器端代理以及其他技术来解决此限制,但社区对允许本机跨域 Ajax 请求的强烈抗议。许多人没有意识到,几乎所有浏览器(Internet Explorer 8+、Firefox 3.5+、Safari 4+ 和 Chrome)目前都通过称为跨源资源共享的协议支持跨域 Ajax。

跨域资源共享 (CORS)

跨源资源共享(CORS) 是 W3C 工作草案,定义了跨源访问源时浏览器和服务器必须如何通信。CORS 背后的基本思想是使用自定义 HTTP 标头,让浏览器和服务器充分了解彼此,以确定请求或响应应该成功还是失败。

对于一个简单的请求,即使用 GET 或 POST 且不带自定义标头且正文为 的请求text/plain,该请求会使用名为 的额外标头发送Origin。标Origin头包含请求页面的来源(协议、域名和端口),以便服务器可以轻松确定是否应该提供响应。示例Origin标头可能如下所示:

Origin: https://humanwhocodes.com

如果服务器决定允许该请求,它会发送一个Access-Control-Allow-Origin标头,回显与发送的相同来源或“*”(如果它是公共资源)。例如:

Access-Control-Allow-Origin: https://humanwhocodes.com

如果此标头丢失,或者来源不匹配,则浏览器将不允许该请求。如果一切顺利,浏览器就会处理该请求。请注意,请求和响应都不包含 cookie 信息。

前面提到的所有浏览器都支持这些简单的请求。Firefox 3.5+、Safari 4+ 和 Chrome 都支持通过该XMLHttpRequest对象使用。当尝试打开不同来源的资源时,此行为会自动触发,无需任何额外代码。例如:

var xhr = new XMLHttpRequest();
xhr.open("get", "https://humanwhocodes.com/some_resource/", true);
xhr.onload = function(){//instead of onreadystatechange
//do something
};
xhr.send(null);

要在 Internet Explorer 8 中执行相同的操作,您需要以相同的方式使用该XDomainRequest对象:

var xdr = new XDomainRequest();
xdr.open("get", " 
xdr.onload = function(){
//do something
};
xdr.send();

Mozilla 团队在有关 CORS 的帖子中建议您应该检查该withCredentials属性是否存在,以确定浏览器是否通过 XHR 支持 CORS。然后,您可以结合该XDomainRequest对象的存在来覆盖所有浏览器:

function createCORSRequest(method, url){
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr){
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined"){
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        xhr = null;
    }
    return xhr;
}

var request = createCORSRequest("get", "https://humanwhocodes.com/");
if (request){
    request.onload = function(){
        //do something with request.responseText
    };
    request.send();
}

Firefox、Safari 和 Chrome 中的对象XMLHttpRequest与 IE 对象具有足够相似的接口XDomainRequest,因此该模式工作得相当好。常见的接口属性/方法有:

  • abort()– 用于停止已经在进行的请求。

  • onerror– 使用而不是onreadystatechange检测错误。

  • onload– 使用而不是onreadystatechange检测成功。

  • responseText– 用于获取响应内容。

  • send()– 用于发送请求。

预检请求

CORS 允许通过称为预检请求的透明服务器验证机制使用自定义标头、GET 或 POST 以外的方法以及不同的正文内容类型。当您尝试使用高级选项之一发出请求时,系统会向服务器发出“预检”请求。此请求使用 OPTIONS 方法并发送以下标头:

  • Origin– 与简单请求相同。

  • Access-Control-Request-Method– 请求想要使用的方法。

  • Access-Control-Request-Headers– (可选)正在使用的自定义标头的逗号分隔列表。

假设一个带有名为 的自定义标头的 POST 请求的示例NCZ:

Origin: https://humanwhocodes.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: NCZ


文章来源地址https://www.toymoban.com/diary/js/293.html

在此请求期间,服务器可以确定是否允许此类请求。服务器通过在响应中发送以下标头将此信息传达给浏览器:

  • Access-Control-Allow-Origin– 与简单请求相同。

  • Access-Control-Allow-Methods– 允许的方法的逗号分隔列表。

  • Access-Control-Allow-Headers– 服务器允许的标头的逗号分隔列表。

  • Access-Control-Max-Age– 此预检请求应缓存的时间(以秒为单位)。

例子:

Access-Control-Allow-Origin: https://humanwhocodes.com
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Headers: NCZ
Access-Control-Max-Age: 1728000

一旦发出预检请求,结果将被缓存响应中指定的时间段;您只会在第一次发出此类请求时产生额外 HTTP 请求的费用。

Firefox 3.5+、Safari 4+ 和 Chrome 均支持预检请求;Internet Explorer 8 没有。

凭证请求

默认情况下,跨源请求不提供凭据(cookie、HTTP 身份验证和客户端 SSL 证书)。您可以通过将该属性设置为 true 来指定请求应发送凭据withCredentials。如果服务器允许凭据请求,则它会使用以下 HTTP 标头进行响应:

Access-Control-Allow-Credentials: true

如果发送了凭据请求并且此标头未作为响应的一部分发送,则浏览器不会将响应传递给 JavaScript(responseText是空字符串,status为 0,并且onerror()被调用)。请注意,服务器还可以发送此 HTTP 标头作为预检响应的一部分,以指示允许源发送凭证请求。

Internet Explorer 8 不支持该withCredentials属性;Firefox 3.5、Safari 4 和 Chrome 都支持它。

结论

现代 Web 浏览器对跨域 Ajax 提供了大量可靠的支持,但大多数开发人员仍然没有意识到这种强大的功能。使用时只需要一点额外的 JavaScript 工作和一点额外的服务器端工作即可确保发送正确的标头。IE8 的实现在允许高级请求和凭据请求方面落后于其他版本,但希望对 CORS 的支持将继续改进。


到此这篇关于PDF.js CORS 问题的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/js/293.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
上一篇 2023年08月19日 16:46
下一篇 2023年08月25日 15:26

相关文章

  • PDF.js - 免费开源的 JavaScript 读取、显示 PDF 文档的工具库,由 Mozilla 开发并且持续维护

    最近新项目需要处理 PDF,研究了 PDf.js 之后觉得很不错,于是写篇文章推荐给大家。 PDF.js 的功能和它的名字一样简单,是一个使用 HTML5 技术来让前端网页支持读取、解析和显示 PDF 文档的 JS 工具库。这个项目由大名鼎鼎的 Mozilla 组织开发并且更新维护着,没错,就是那个开

    2024年01月21日
    浏览(53)
  • 【PDF.js】PDF文件预览

    使用PDFJS实现pdf文件的预览,支持预览指定页、搜索、缩略图、页面尺寸调整等等。 官方地址 文档地址 下载地址 将下载的压缩包解压并放入到项目中的public文件夹下,我这里下载的是pdfjs-4.0.379-dist版本,如下 在 pdfjs-4.0.379-dist/web/viewer.mjs 内搜索 throw new Error(“file or

    2024年04月11日
    浏览(64)
  • pdf.js预览pdf文件

    预览pdf一般通过浏览器自带的pdf预览器就可以,但有时候需要窗口预览或自定义操作,可以使用pdf.js操作 pdf.js需要构建后使用,我们可以直接下载安装pdfjs-dist,这是构建好的版本 这里注意你的环境,新版本使用了可选链,空值合并和私有 class 字段/方法等,如果你的浏览器

    2024年02月03日
    浏览(69)
  • JavaScript快速入门:ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器

    在当今丰富的网络环境中,处理 PDF 文档已成为企业和开发人员的必需品。ComPDFKit 是一款支持 Web 平台并且功能强大的 PDF SDK,开发人员可以利用它创建 PDF 查看器和编辑器,让您的最终用户轻松查看和编辑 PDF。无论您是在构建基于 Web 端的文档管理系统还是在线协作平台,

    2024年02月15日
    浏览(47)
  • 奇舞周刊第497期:解锁 PDF 文件:使用 JavaScript 和 Canvas 渲染 PDF 内容

    记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~  解锁 PDF 文件:使用 JavaScript 和 Canvas 渲染 PDF 内容 最近研究了 Web 的 FileSystemAccess Api,它弥补了 Web 长期以来缺少的能力:操作用户设备中的文件;而如今通过这个 Api 我们能够实现常见的文件

    2024年02月11日
    浏览(47)
  • 网页在线打开PDF_网站中在线查看PDF之pdf.js

    一、pdf.js简介 PDF.js 是一个使用 HTML5 构建的便携式文档格式查看器。 pdf.js 是社区驱动的,并由 Mozilla 支持。我们的目标是为解析和呈现 PDF 创建一个通用的、基于 Web 标准的平台。 pdf.js 将 PDF 文档转换为 HTML5 Canvas 元素 ,并使用 JavaScript 控制文档的呈现和交互。pdf.js 使得不

    2024年02月04日
    浏览(51)
  • vue3项目使用pdf.js插件实现:搜索高亮、修改pdf.js显示的页码、向pdf.js传值、控制搜索、处理接口文件流

    官网地址:http://mozilla.github.io/pdf.js/ 中文文档地址:https://gitcode.gitcode.host/docs-cn/pdf.js-docs-cn/print.html PDF.js是基于HTML5技术构建的,用于展示可移植文档格式的文件(PDF),它可以在现代浏览器中使用且无需安装任何第三方插件。 pdf.js主要包含两个库文件 pdf.js:负责API解析 pdf.wor

    2024年02月13日
    浏览(70)
  • 使用pdf.js展示pdf文件(亲测可用)

    如果只是电脑端,可通过 iframe 标签嵌套预览 ios手机端可通过 a 标签包裹点击跳转预览(安卓端不行) 资料 老版本github地址 全版本地址 正式开始 前往官方地址下载插件包 http://mozilla.github.io/pdf.js/ 此链接可下载最新版本,不兼容老版本浏览器和苹果系统,若需在苹果展示则

    2024年02月11日
    浏览(42)
  • c#和pdf.js实现分片预览pdf

    源码如下: 源代码github地址: https://github.com/LeoMingGit/dotNetPractiseCollect/blob/master/%E5%88%86%E7%89%87%E9%A2%84%E8%A7%88pdf/FileStoreController.cs

    2024年02月12日
    浏览(38)
  • 【PDF.js】PDF.js部署到服务器提示找不到mjs文件

    例如:项目场景:要做一个扫描二维码跳转到网页预览PDF的功能。 本来是直接用iframe标签直接加载PDF文件,结果在Android手机上无法预览,于是看网上有人说用pdf.js可以。不过下载之后放到服务器上一访问总是提示找不到pdf.mjs和viewer.mjs.map这两个文件,提示404,本地可以。 尝

    2024年04月13日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包