问题:
发送协议请求一个文件流,需要在回包里拿到响应头里的 Content-Disposition 字段的值,从中分离出文件名。
但是通过查看控制台,header 里确实有这个属性:

在控制台 Network 里明明能看到,但是在响应拦截器里用 js headers[“content-disposition”] 来获取,但是打印 header 对象里并没有 content-disposition 无法获取,这是什么原因?

原因:
根据MDN文档:Access-Control-Expose-Headers
默认情况下,header 只有7种 simple response headers (简单响应首部)可以暴露给外部:

名称
Cache-Control 通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制
Content-Language 说明访问者希望采用的语言或语言组合,这样的话用户就可以根据自己偏好的语言来定制不同的内容
Content-Length 指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目
Content-Type 告诉客户端实际返回的内容的内容类型
Expires 响应头包含日期/时间, 即在此时候之后,响应过期
Last-Modified 包含源头服务器认定的资源做出修改的日期及时间
Pragma HTTP/1.0 中规定的通用首部,用来向后兼容只支持 HTTP/1.0 协议的缓存服务器

这里的暴露给外部,意思是让客户端可以访问得到,既可以在 Network 里看到,也可以在代码里获取到它们的值。

上面问题提到的 content-disposition 不在其中,所以即使服务器在协议回包里加了该字段,但因没“暴露”给外部,客户端就“看得到,吃不到”。

而响应首部 Access-Control-Expose-Headers 就是控制“暴露”的开关,它列出了哪些首部可以作为响应的一部分暴露给外部。所以如果想要让客户端可以访问到其他的首部信息,服务器不仅要在 header 里加入该首部,还要将它们在 Access-Control-Expose-Headers 里面列出来。

解决:
服务端:

response.setHeader("Access-Control-Expose-Headers", "Content-Disposition")
response.setHeader("Content-Disposition", ...)

成功设置后,服务台 Network 可以看到:

这样一来,客户端就能获取到响应 header 的 Content-Disposition 字段的值了。

eg: 附一份 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() {@Overridepublic 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();}
}

JavaScript 无法获取响应 header 的 Content-Disposition 字段相关推荐

  1. 【PHP】获取浏览器HTTP请求header信息、获取服务器HTTP响应header信息

    一.认识HTTP HTTP协议历史及设计思路(点击浏览) 二.获取浏览器HTTP请求header信息 1. Apach服务器下可以直接使用 PHP自带函数获取客户端HTTP请求头信息 /*作用:获取客 ...

  2. java 获得header,Java获取Http响应Header信息

    本文中演示如何通过URLConnection获取Http响应Header信息 1.从响应中获得Header信息 URL obj = new URL("http://www.qiyadeng. ...

  3. 每天一个JavaScript实例-获取元素当前高度

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. python构造响应头_Python爬虫库requests获取响应内容、响应状态码、响应头

    首先在程序中引入Requests模块 import requests 一.获取不同类型的响应内容 在发送请求后,服务器会返回一个响应内容,而且requests通常会自动解码响应内容 1.文本响应内容 ...

  5. Nodejs中搭建一个静态Web服务器,通过读取文件获取响应类型

    场景 Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件让全世界浏览,还可以放置数据文件,让全世界下载.目前最主流的Web服务 ...

  6. java 请求url 返回数据_java后台发起get请求获取响应数据|chu

    本文实例为大家分享了java后台发起get请求获取响应数据,供大家参考,具体内容如下 学习记录: 话不多说直接上代码: package com.jl.chromeTest; import java.i ...

  7. rest-assured之获取响应数据(Getting Response Data)

    我们使用rest-assured可以获得响应内容,比如:我们发起一个get请求 get("/lotto") 并且获得响应内容,我们有多种方式可以实现: 1 // 通过流的方式获得响 ...

  8. python request返回的响应_Python爬虫库requests获取响应内容、响应状态码、响应头...

    首先在程序中引入Requests模块 import requests 一.获取不同类型的响应内容 在发送请求后,服务器会返回一个响应内容,而且requests通常会自动解码响应内容 1.文本响应内容 ...

  9. HTTP Header中的内容(请求Header、响应Header)

    HTTP 请求和相应 Header 服务器端接受到浏览器端的请求后,生成用户需要的文件,发回响应Header . 浏览器端向服务器端发送的请求Header 如下: Host zhiqiang.org ...

最新文章

  1. 16_python_面向对象
  2. Android View的加载过程
  3. 《Effective C#》某些地方实在是对不起Effective这个词(I)
  4. Python-OpenCV学习--USB摄像头读取图像上下翻转
  5. nodejs + Mysql 在前端页面控制后台数据
  6. 【机器视觉】 Halcon批量加载图像
  7. fastreport 直接调网络打印机_为什么UV打印机不能打印凹凸不平的材料?
  8. STM32H743+CubeMX-计算FDCAN2上的MessageRAMOffset(使两路FDCAN正常工作)
  9. 清空邮件队列中的邮件
  10. Spark在文本统计中的简单应用
  11. jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
  12. mysql插入二进制命令_MySQL将语句写入到binlog二进制日志中
  13. vs2008添加注释宏(暂未成功设置)
  14. zlib 加密 java_JAVA自带Zlib+base64位压缩加密和解压解密
  15. gulp教程之gulp-uglify(压缩javascript文件,减小文件大小)
  16. 鸿鹄系统和鸿蒙系统电脑,荣耀智慧屏发布:首发鸿鹄818处理器及鸿蒙系统,定价3799元起...
  17. 头脑王者源码微信答题小程序pk知识问答源码介绍
  18. BOOST电路参数计算
  19. html5刮刮卡,canvas 实现刮刮卡
  20. 【2020省选模拟】题解

热门文章

  1. 涨粉神器,粉丝零距离交流!CSDN APP迎来更新
  2. OSI模型及数据封装过程
  3. 三星530换固态硬盘_imac换固态硬盘,提升运行速度
  4. 实验二(1)-配置 IPv4 静态路由和默认路由
  5. Cron 表达式详解及最新版本使用
  6. iframe在html中怎么写,html中如何使用iframe标签链接网址呢?
  7. 狼人杀个人理解玩法之(骑士)
  8. B-010 详细解析电源滤波电容的选取与计算
  9. Unity优化☀️渲染篇:CPU/GPU
  10. 判断两个字符串是否相等的函数