Javascript PDF.js不会重定向到位于Firefox中启用CORS的另一台服务器上的PDF文件

Javascript PDF.js不会重定向到位于Firefox中启用CORS的另一台服务器上的PDF文件,javascript,scala,spring-mvc,amazon-s3,pdf.js,Javascript,Scala,Spring Mvc,Amazon S3,Pdf.js,我有一个网站需要改进。此网站包含每个用户独有的pdf文件,并且使用pdf.js库允许用户查看这些文件。这些pdf文件通过链接的第一次调用自动生成,如httö://website.com/api/client/255/product/90/livePdfPreviewFile,该链接返回内容类型:application/pdf,然后生成的文件将缓存在AmazonS3存储中——在通过同一链接进行下一次调用后,它将由我的服务器从AS3下载,并提供给客户端进行预览,而不是重新生成。因此,链接作为GET参

我有一个网站需要改进。此网站包含每个用户独有的pdf文件,并且使用pdf.js库允许用户查看这些文件。这些pdf文件通过链接的第一次调用自动生成,如
httö://website.com/api/client/255/product/90/livePdfPreviewFile
,该链接返回
内容类型:application/pdf
,然后生成的文件将缓存在AmazonS3存储中——在通过同一链接进行下一次调用后,它将由我的服务器从AS3下载,并提供给客户端进行预览,而不是重新生成。因此,链接作为GET参数传递给PDF.js脚本,如下所示:

httр://website.com//resources/web/viewer.html?file=api%2Fclient%2F255%2Fproduct%2F90%2FlivePdfPreviewFile
一切正常,但我必须减少服务器负载,并将服务器响应直接重定向到AmazonS3存储中的文件,而不是将服务器用作这些文件的网关。我已经使用AmazonS3 API配置了CORS设置(这是一个简单的配置,没有允许和公开的标题,但它可以与Google Chrome一起使用):

然后,我更改了负责将pdf文件返回到客户端的代码,以便它可以重定向到缓存文件:

if (isResourceCached(pdf)) {
    response.sendRedirect(getDirectLinkToCache(pdf))
} else {
    response.setContentType("application/pdf")
    val renderedPdf = renderPdf(productId)
    cachePdf(renderedPdf)
    val out = response.getOutputStream
    IOUtils.copy(new ByteArrayInputStream(renderedPdf.toByteArray), out)
    out.flush()
    out.close()
}
但是有一个问题——这些重定向在Firefox中不起作用,但在其他浏览器(如Google Chrome)中效果很好!当我将文件传递到直接位于AS3存储中的PDF.js时,它也适用于Firefox,当文件未缓存在AS3中且PDF生成链接返回PDF文件而不是重定向时,它也适用。我试图设置其他CORS参数,但后来我意识到Firefox甚至不尝试对AS3服务器执行任何查询

这就是Chrome的功能。第一个问题:

Remote Address:127.0.0.1:8080
Request URL:http://127.0.0.1:8080/api/client/255/product/90/livePdfPreviewFile
Request Method:GET
Status Code:302 Found

Response Headers
view source
Cache-Control:no-cache
Cache-Control:no-store
Content-Length:0
Date:Thu, 03 Sep 2015 08:06:01 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Location:http://bucket-local.s3.amazonaws.com/product-preview-pdfs/90-255.pdf
Pragma:no-cache
Server:Apache-Coyote/1.1

Request Headers
view source
Accept:*//*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:JSESSIONID=856CF2090D14BC3E6C869CD5158CAF40
Host:127.0.0.1:8080
Referer:http://127.0.0.1:8080/resources/web/viewer.html?file=%2Fapi%2Fclient%2F255%2Fproduct%2F90%2FlivePdfPreviewFile
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36
以及接收我们通过上述查询获得的文件的位置:

Remote Address:54.231.176.29:80
Request URL:http://bucket-local.s3.amazonaws.com/product-preview-pdfs/90-255.pdf
Request Method:GET
Status Code:200 OK

Response Headers
view source
Accept-Ranges:bytes
Access-Control-Allow-Methods:GET
Access-Control-Allow-Origin:*
Content-Length:26263
Content-Type:application/octet-stream
Date:Thu, 03 Sep 2015 08:11:45 GMT
ETag:"04a1c8853281706a478ce60080c3435f"
Last-Modified:Wed, 02 Sep 2015 07:29:41 GMT
Server:AmazonS3
Vary:Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-expiration:expiry-date="Fri, 04 Sep 2015 00:00:00 GMT", rule-id="Delete pdfs in 1 day"
x-amz-id-2:YgGqaaIZ73tsnKhUdffU5Mit3nfFLx7dyX1or7redDN2TRjGK2e1AraE5Ks8Zy3oFavlyI3LNSc=
x-amz-request-id:BA7DA8570C9E7D32

Request Headers
view source
Accept:*//*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:bucket-local.s3.amazonaws.com
Origin:http://127.0.0.1:8080
Referer:http://127.0.0.1:8080/resources/web/viewer.html?file=%2Fapi%2Fclient%2F255%2Fproduct%2F90%2FlivePdfPreviewFile
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36
之后,Pdf将在浏览器中完美显示。但Firefox甚至不尝试执行重定向。这个浏览器所做的只是从我的服务器接收302,之后它什么也不做。它甚至不尝试对AS3执行任何查询

我只得到了第一个查询的响应:

Request URL:    http://127.0.0.1:8080/api/client/255/product/90/livePdfPreviewFile
Request Method:     GET
Status Code:    HTTP/1.1 302 Found

Request Headers 10:16:05.000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0
Referer:    http://127.0.0.1:8080/resources/js/pdfjs/pdf.worker.js
Host:   127.0.0.1:8080
Connection: keep-alive
Accept-Language:    en-US,en;q=0.5
Accept-Encoding:    gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*//*;q=0.8
Sent Cookie
JSESSIONID: EB6EC83CFE958FF3FD994A61A4CC7CDE

Response Headers Δ1546ms
Server: Apache-Coyote/1.1
Pragma: no-cache
Location:   http://bucket-local.s3.amazonaws.com/product-preview-pdfs/90-255.pdf
Expires:    Thu, 01 Jan 1970 00:00:00 GMT
Date:   Thu, 03 Sep 2015 07:16:06 GMT
Content-Length: 0
Cache-Control:  no-cache, no-store
这是Firefox执行的最后一次查询,Firebug的控制台和网络选项卡中没有其他内容

相反,PDF.js会执行以下操作:

PDF.js v1.0.1040(内部版本:997096f)消息:意外的服务器响应 (0)检索PDF时 “”

那么,为什么Firefox甚至不尝试对通过重定向获得的文件位置执行查询呢?我已经调试了PDF.js的javascript,但Firefox最近似乎在
self.load
上抛出异常,并将其作为“意外服务器响应”处理:

PDFJS.getDocument(参数、pdfDataRangeTransport、需要密码、,
getDocumentProgress)。然后(
函数getDocumentCallback(pdfDocument){
自加载(PDF文档、刻度);
自加载=错误;
}, ...  

我也遇到了同样的问题。使用CORS的302到另一台主机只能在Chrome上正常工作。允许它在Firefox和IE上工作的更改(Safari到目前为止仍然不工作)包括了所有的源代码

在我之前

<script src="bower_components/pdfjs-dist/build/pdf.js"></script>
<script>
   PDFJS.workerSrc = 'bower_components/pdfjs-dist/build/pdf.worker.js'
</script>

PDFJS.workerSrc='bower_components/PDFJS dist/build/pdf.worker.js'
变动后

<script src="bower_components/pdfjs-dist/build/pdf.combined.js"></script>

祝你好运

更新

事实证明,使用pdf.combined.js可以有效地关闭webworker进行渲染,正如上面建议的答案之一

但是有一种方法可以让它与使用Blob和URL.createObjectURL启用的webworkers一起工作


你能用常规的XHR请求重现它吗?(PDF.js在引擎盖下使用它)我强迫
PDFJS.disableWorker
true
,现在它工作了。你的解决方案不是真的解决了这个问题,而是强迫PDF.js在次优模式下工作。你可以用常规的XHR请求在worker中重现它(如果重定向与CORS一起使用)。在
<script src="bower_components/pdfjs-dist/build/pdf.js"></script>
<script>
   PDFJS.workerSrc = 'bower_components/pdfjs-dist/build/pdf.worker.js'
</script>
<script src="bower_components/pdfjs-dist/build/pdf.combined.js"></script>