JavaScript 无法获取响应 header 的 Content-Disposition 字段
问题:
发送协议请求一个文件流,需要在回包里拿到响应头里的 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 字段相关推荐
- 【PHP】获取浏览器HTTP请求header信息、获取服务器HTTP响应header信息
一.认识HTTP HTTP协议历史及设计思路(点击浏览) 二.获取浏览器HTTP请求header信息 1. Apach服务器下可以直接使用 PHP自带函数获取客户端HTTP请求头信息 /*作用:获取客 ...
- java 获得header,Java获取Http响应Header信息
本文中演示如何通过URLConnection获取Http响应Header信息 1.从响应中获得Header信息 URL obj = new URL("http://www.qiyadeng. ...
- 每天一个JavaScript实例-获取元素当前高度
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- python构造响应头_Python爬虫库requests获取响应内容、响应状态码、响应头
首先在程序中引入Requests模块 import requests 一.获取不同类型的响应内容 在发送请求后,服务器会返回一个响应内容,而且requests通常会自动解码响应内容 1.文本响应内容 ...
- Nodejs中搭建一个静态Web服务器,通过读取文件获取响应类型
场景 Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件让全世界浏览,还可以放置数据文件,让全世界下载.目前最主流的Web服务 ...
- java 请求url 返回数据_java后台发起get请求获取响应数据|chu
本文实例为大家分享了java后台发起get请求获取响应数据,供大家参考,具体内容如下 学习记录: 话不多说直接上代码: package com.jl.chromeTest; import java.i ...
- rest-assured之获取响应数据(Getting Response Data)
我们使用rest-assured可以获得响应内容,比如:我们发起一个get请求 get("/lotto") 并且获得响应内容,我们有多种方式可以实现: 1 // 通过流的方式获得响 ...
- python request返回的响应_Python爬虫库requests获取响应内容、响应状态码、响应头...
首先在程序中引入Requests模块 import requests 一.获取不同类型的响应内容 在发送请求后,服务器会返回一个响应内容,而且requests通常会自动解码响应内容 1.文本响应内容 ...
- HTTP Header中的内容(请求Header、响应Header)
HTTP 请求和相应 Header 服务器端接受到浏览器端的请求后,生成用户需要的文件,发回响应Header . 浏览器端向服务器端发送的请求Header 如下: Host zhiqiang.org ...
最新文章
- 16_python_面向对象
- Android View的加载过程
- 《Effective C#》某些地方实在是对不起Effective这个词(I)
- Python-OpenCV学习--USB摄像头读取图像上下翻转
- nodejs + Mysql 在前端页面控制后台数据
- 【机器视觉】 Halcon批量加载图像
- fastreport 直接调网络打印机_为什么UV打印机不能打印凹凸不平的材料?
- STM32H743+CubeMX-计算FDCAN2上的MessageRAMOffset(使两路FDCAN正常工作)
- 清空邮件队列中的邮件
- Spark在文本统计中的简单应用
- jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
- mysql插入二进制命令_MySQL将语句写入到binlog二进制日志中
- vs2008添加注释宏(暂未成功设置)
- zlib 加密 java_JAVA自带Zlib+base64位压缩加密和解压解密
- gulp教程之gulp-uglify(压缩javascript文件,减小文件大小)
- 鸿鹄系统和鸿蒙系统电脑,荣耀智慧屏发布:首发鸿鹄818处理器及鸿蒙系统,定价3799元起...
- 头脑王者源码微信答题小程序pk知识问答源码介绍
- BOOST电路参数计算
- html5刮刮卡,canvas 实现刮刮卡
- 【2020省选模拟】题解