axios無法獲取響應頭headers的Content-Disposition


在控制台Network里明明能看到,但是在響應攔截器里用js headers["content-disposition"]來獲取,但是打印 header對象里並沒有content-disposition,無法獲取,這是什么原因?

 

根據MDN文檔:Access-Control-Expose-Headers

默認情況下,header只有六種 simple response headers (簡單響應首部)可以暴露給外部:

Cache-Control
Content-Language
Content-Type
Expires
Last-Modified
Pragma
這里的暴露給外部,意思是讓客戶端可以訪問得到,既可以在Network里看到,也可以在代碼里獲取到他們的值。

上面問題提到的content-disposition不在其中,所以即使服務器在協議回包里加了該字段,但因沒“暴露”給外部,客戶端就“看得到,吃不到”。

而響應首部 Access-Control-Expose-Headers 就是控制“暴露”的開關,它列出了哪些首部可以作為響應的一部分暴露給外部。

所以如果想要讓客戶端可以訪問到其他的首部信息,服務器不僅要在heade里加入該首部,還要將它們在 Access-Control-Expose-Headers 里面列出來

 

解決辦法

response.setHeader("Access-Control-Expose-Headers", "Content-Disposition")
response.setHeader("Content-Disposition", ...)
附一份jersey的后台例子

package com.howtodoinjava.jersey;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;

@Path("/download")
public class JerseyService
{
@GET
@Path("/pdf")
public Response downloadPdfFile()
{
StreamingOutput fileStream = new StreamingOutput()
{
@Override
public void write(java.io.OutputStream output) throws IOException, WebApplicationException
{
try
{
java.nio.file.Path path = Paths.get("C:/temp/test.pdf");
byte[] data = Files.readAllBytes(path);
output.write(data);
output.flush();
}
catch (Exception e)
{
throw new WebApplicationException("File Not Found !!");
}
}
};
return Response
.ok(fileStream, MediaType.APPLICATION_OCTET_STREAM)
.header("content-disposition","attachment; filename = myfile.pdf")
.header("Access-Control-Expose-Headers", "Content-Disposition")
.build();
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM