问题描述

下载文件,返回的对象为blob。
框架封装了所有的异常,不管后台处理正确与否,http的状态都为200. 后台想把异常信息传递给前台,通过设置header方式,代码如下:

#HttpHeader, Resource, ResponseEntity都是spring提供实现
HttpHeader headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
headers.add("charset", "UTF-8");
headers.add("file-name", "自己定义的文件名称");
headers.add("error-message", "后台处理的异常信息");Resource resource = new InputStreamResource(fileInputStream);
return ReponseEntity.ok().headers(headers).body();

但是前端并没有接到"file-name"和"error-message"的header。
后来发现,是因为跨域不支持用户自定义header。

默认支持的header

Cache-Control

Cache-Control 通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。
支持的指令:

header 指令 描述
Cache-control must-revalidate 一旦资源过期(比如已经超过max-age),在成功向原始服务器验证之前,缓存不能用该资源响应后续请求。
Cache-control no-cache 在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证(协商缓存验证)。
Cache-control no-store 缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。
Cache-control no-transform 不得对资源进行转换或转变。
Cache-control public 表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。
Cache-control private 表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。
Cache-control proxy-revalidate 与must-revalidate作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。
Cache-Control max-age= 设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与Expires相反,时间是相对于请求的时间。
Cache-control s-maxage= 覆盖max-age或者Expires头,但是仅适用于共享缓存(比如各个代理),私有缓存会忽略它。

Content-Language

Content-Language 是一个 entity header (实体消息首部),用来说明访问者希望采用的语言或语言组合,这样的话用户就可以根据自己偏好的语言来定制不同的内容。

Content-Length

Content-Length 是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。

Content-Type

在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。
org.springframework.http.MediaType里面列举了大部分的类型。
语法:

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something

type大分类:

  • application
  • audio
  • example
  • font
  • image
  • model
  • text
  • video

常用media-type:

  • application/octet-stream 二进制文件的默认值
  • text/plain 文档文件
  • text/css css文件
  • text/html html文件
  • text/javascript js文件
  • multipart/form-data 表单

Expires

Expires 响应头包含日期/时间, 即在此时候之后,响应过期。
如果在Cache-Control响应头设置了 “max-age” 或者 “s-max-age” 指令,那么 Expires 头会被忽略。

Last-Modified

Last-Modified是一个响应首部,其中包含源头服务器认定的资源做出修改的日期及时间。
它通常被用作一个验证器来判断接收到的或者存储的资源是否彼此一致。

Pragma

Pragma 是一个在 HTTP/1.0 中规定的通用首部,这个首部的效果依赖于不同的实现,所以在“请求-响应”链中可能会有不同的效果。

Pragma: no-cache

添加用户自定义header:Access-Control-Expose-Headers

后端源码:

@GetMapping(value = "/download/file")
public ResponseEntity<Resource> download(HttpServletResponse response){response.addHeader("Access-Control-Expose-Headers", "file-name, error-message");#HttpHeader, Resource, ResponseEntity都是spring提供实现HttpHeader headers = new HttpHeaders();headers.add("Cache-Control", "no-cache, no-store, must-revalidate");headers.add("Pragma", "no-cache");headers.add("Expires", "0");headers.add("charset", "UTF-8");headers.add("file-name", "自己定义的文件名称");headers.add("error-message", "后台处理的异常信息");Resource resource = new InputStreamResource(fileInputStream);return ReponseEntity.ok().headers(headers).body();
}

前端代码:

    axios({mehtod: GET,url: download/file,params: {},headers: {'Content-Type': 'applicaton/x-www-form-urlencoded','token': 'access control info token'...},responseType:'blob'}).then(res => {const fileName = res.headers['file-name']const errorMessage = res.headers['error-message']if (errorMessage) {this.message.error('错误信息:' + errorMessage)} else {...}})

Http 自定义header传输信息相关推荐

  1. python3使用requests模块完成get/post/代理/自定义header/自定义Cookie

    一.背景说明 http请求的难易对一门语言来说是很重要的而且是越来越重要,但对于python一是urllib一些写法不太符合人的思维习惯文档也相当难看,二是在python2.x和python3.x中写 ...

  2. dio设置自定义post请求_Flutter Dio简单二次封装和自定义Header

    话不多说自己看代码封装的比较简单,比较适合入门学习Dio. import 'package:dio/dio.dart'; import 'Api.dart'; /* * 封装 restful 请求 * ...

  3. 模拟get和post请求(支持自定义header和测试CDN节点)

    下面是一个模拟get或者post请求的方法支持 1.get,post方法 2.自定义参数 3.自定义header 4.返回服务器的返回内容和header 5.支持相特定的服务器请求url,适合测试cd ...

  4. Nginx获取自定义header

    想要获取自定义header,必须开启下划线支持 underscores_in_headers on;可以配置在http或者server中.参考 http://nginx.org/en/docs/htt ...

  5. python selenium post请求_工作随笔——selenium支持post请求,支持自定义header

    2018-01-10:fix post 请求数据遗漏部分内容 背景: 最近在写一个小程序,发现博主所在的地区访问该网站时有防ddos功能验证导致程序不能正常工作. 经过试验发现可以用国外代理ip解决这 ...

  6. 接口测试--apipost如何自定义header中的content-type

    使用apipost进行接口测试的时候,有时候会用到一些自定义或者不常见的content-type格式,这个时候就要手动在header头部自定义content-type. 这里我们自定义一个conten ...

  7. 【nginx】4xx,5xx 保持自定义header

    问题 nginx使用中,如果请求返回的状态code类似404或者50x这种,仍然返回自定义的header. 分析和解决 nginx文档中关于 add_header的部分 有这么一句 Adds the ...

  8. ios mj_refresh 上拉、下拉、自定义header、footer、afn子类化

      1. MJRefreshNormalHeader.MJRefreshAutoNormalFooter基本使用   2. 自定义XMGRefreshHeader.XMGRefreshFooter   ...

  9. 服务器修改referer,electron自定义header伪装ua及referer欺骗远程服务器

    本文中,苏南大叔讲述一下electron的几个邪门使用方式.为啥说是邪门方式呢?因为正常的程序不会这么干的.那就是:修改user-agent和referer,也就是伪装客户端信息,用于欺骗特定的远程服 ...

最新文章

  1. MongoDB 启动 Failed to connect to 127.0.0.1:27017, reason: 由于目标计算机积极拒绝,无法连接。...
  2. leetcode C++ 28. 实现 strStr() 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 need
  3. 「SDOI2016」储能表(数位dp)
  4. Oracle 11g安装图文攻略
  5. 大数据开发 | MapReduce介绍
  6. salt-api安装与配置
  7. 用VC打开位图程序[转]
  8. 北大等多所高校网站被挂马 高考生浏览需小心
  9. FlexSim软件PF模块标识详细解释
  10. 莫烦python 强化学习 (Reinforcement Learning)
  11. Java实验-输出希腊字母表
  12. PHP获取当前域名(判断域名)
  13. H264中一些很有用的解释
  14. 【MTK AF】Acce/Gyro/PD/Laser Driver Check
  15. 计算机设置新网络,新买的电脑怎么设置网络连接
  16. 保存SVM模型并调用
  17. 推荐六款逆天好用的黑科技微信小程序,手机内存再小也可以任性耍
  18. 计算机c盘空间满了应该怎么办,C盘空间越来越小怎么办?电脑C盘满了怎么办?...
  19. DIV+CSS中标签dl dt dd常用的用法
  20. Android app security安全问题总结

热门文章

  1. 禾赛科技上市首份财报:出货量激增467.5% 亏损率降至25%
  2. 以交易为生是一种什么体验?
  3. ogg登陆数据库用户密码加密
  4. ue4_timeline时间轴
  5. 关于我在b站自学JAVA SE常用类这件事
  6. 药都银行冲刺上交所:年营收22.78亿 古井集团是股东
  7. 如何在word中打钩
  8. 怎样在Safari中禁用自动播放视频?
  9. Linux设置进程CPU亲和力(核心绑定)
  10. 项目管理2019.7.14/10.25