js无法获取headers中Content-Disposition

问题重现

前端实现导出下载功能

这里是实现了 导出的功能 但是在线上的时候 出现了 导出失败的问题;

我们需要拿到响应头里的Content-Disposition字段的值,从中分离出文件名。

在这里插入图片描述

本地可以看到 打印出来了content-disposition

在这里插入图片描述
线上的network中也可以看到 这个文件名;但是我把它从请求头中打印出来的时候,就没有这个字段;所以线上就会导出失败
在这里插入图片描述

分析问题

浏览器限制了这一类请求头的暴露问题;所以需要服务端配合完成;

在这里插入图片描述

解决方案

后端虽然加了这个;但是我们只能在network中看到,无法通过js在请求头中拿到Content-Disposition
所以还需要加一段代码

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

效果

加上这一段代码就可以导出成功了;
在这里插入图片描述
这里附上后端代码

在这里插入图片描述

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 可以使用JavaScript通过XMLHttpRequest对象发送HTTP请求,并在响应头查找Content-Disposition头部来获取文件名。具体实现方法如下: 1. 创建XMLHttpRequest对象: ```javascript var xhr = new XMLHttpRequest(); ``` 2. 发送HTTP请求: ```javascript xhr.open('GET', '文件的URL', true); xhr.send(); ``` 3. 获取响应头Content-Disposition头部信息: ```javascript xhr.onload = function() { var contentDisposition = xhr.getResponseHeader('Content-Disposition'); // 解析contentDisposition获取文件名 } ``` 在获取Content-Disposition头部信息后,可以使用正则表达式或其他方法解析出文件名,并进行相应的处理。 ### 回答2: 在跨域的情况下,由于浏览器的同源策略限制,普通的JavaScript无法直接获取到其他域名的响应头信息,包括content-disposition。 但是可以通过一些方法解决这个问题。以下是一种解决方案: 1. 在服务器端设置合适的响应头 要想在跨域的情况下获取content-disposition,我们需要在目标服务器的响应头设置合适的允许跨域资源共享(CORS)相关的响应头。 在服务器端的响应添加以下响应头字段: Access-Control-Expose-Headers: Content-Disposition 2. 前端处理跨域请求 在前端发送跨域请求时,需要设置XMLHttpRequest对象的withCredentials属性为true,以便发送跨域凭证。 同时,需要将contentDisposition响应头信息放入自定义的响应头,比如X-Custom-Content-Disposition。 在服务端的响应添加以下响应头字段: Access-Control-Expose-Headers: X-Custom-Content-Disposition 3. 前端获取content-disposition 在接收到响应后,通过XMLHttpRequest对象的getResponseHeader()方法获取自定义的响应头信息,并从解析出content-disposition字段的值。 示例代码如下: ```javascript var xhr = new XMLHttpRequest(); xhr.withCredentials = true; xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var contentDisposition = xhr.getResponseHeader('X-Custom-Content-Disposition'); // 解析content-disposition字段的值 console.log(contentDisposition); } }; xhr.open('GET', 'http://example.com/api/endpoint', true); xhr.send(); ``` 以上是一种在跨域情况下获取content-disposition的解决方案,通过设置响应头和处理跨域请求,可以在前端通过JavaScript获取content-disposition的值。 ### 回答3: 在跨域的情况下,使用JavaScript获取content-disposition的方式有限。由于浏览器的同源政策的限制,JavaScript只能在相同域的页面对XHR对象返回的HTTP头进行访问,无法直接获取其他域下的服务器返回的HTTP头信息。 但是,如果你对被请求的资源服务器具有控制权,并且允许跨域请求,那么可以通过在服务器端设置Access-Control-Expose-Headers响应头来解决这个问题。 在服务器端的响应头添加Access-Control-Expose-Headers: content-disposition,然后在客户端发送跨域请求时,服务器就会将content-disposition字段暴露出来,在XHR的getResponseHeader()方法可以通过content-disposition参数来获取。 例如,使用XMLHttpRequest发送跨域请求,并获取content-disposition的示例代码如下: ``` var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://其他域的地址', true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var contentDisposition = xhr.getResponseHeader('Content-Disposition'); // 对contentDisposition进行处理 } }; xhr.send(); ``` 需要注意的是,在服务器端设置Access-Control-Expose-Headers响应头之前,需要先配置好跨域请求的相关设置,确保服务器端能够正确处理跨域请求。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小莉爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值