今日遇到的问题Access-Control-Expose-Headers与

前几天在新公司遇到一个问题,返回response中有文件下载的功能,即body中为文件流。使用angular的$http.get的方式获取。服务端使用了cors(我不知道是什么,大概查了下,是解决跨域的服务端封装的问题)。通过使用fiddler截包,header应该有content-disposition这个参数,然后包含文件名filename,能够把下载的流文件直接命名使用。但是$http.get方法回调中,第三个参数,headers中获取不到content-disposition;

success(function (data,status,headers,config)

然后,作为菜鸟,之后求助同事,一开始没找到怎么回事,后来他想起来之前改代码时,封装的response返回修改过,返回 header中缺少了Access-Control-Expose-Headers。

(3)Access-Control-Expose-Headers

该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值。

摘自阮一峰-跨域资源共享 CORS 详解

看完之后,大概了解到content-disposition是额外的header  需要加到Access-Control-Expose-Headers中浏览器才会主动解析(或许我认为的还有偏差)。

还有就是

近日,美国计算机学会(ACM)宣布,英国国计算机科学家、万维网(World Wide Web)的发明者、MIT和牛津大学教授蒂姆 · 伯纳斯 - 李爵士(Tim Berners-Lee)获得2016年度图灵奖

刚好解决这个问题,也看到朋友圈有人发这个,所以,很有感触。

HTTP,WEB,改变了这个世界获取和展示信息的方式。

第二次ajax请求被拒绝的问题

近期遇到问题,终于解决了。

在webapp端ajax对服务器进行post请求的时候,第一次没有问题,第二次返回401,查了一下,未授权访问。

使用get请求时没有问题,用工具模拟post请求也没有问题。为了赶时间,在服务端开发的时候,请求一次,重启一次tomcat。以为是tomcat的问题,换了个版本还是不行。又考虑跨域问题,在服务端加了如下代码也不行。用jsonp也没有解决。

header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Headers:X-Requested-With');

 

后来终于找找公司移动框架和后台框架开发的两个部门的人一起才解决了。

原因是后台框架的安全策略中,对http请求有各种限制,这个问题是因为对header部分的referer做了限制,查询得知这个是防止外链的。

公司webapp的框架中可能没有考虑到这种情况,所以没有设定这个参数,所以第二次请求报错。

解决方法:1,在服务端取消这个限制;2,在ajax请求中对该参数进行设置。

refere