在一些特殊场景中,我们在客户端想要去获取服务端接口设置的一些自定义响应头,服务端该如何处理,客户端才能取到这些自定义响应头的值呢?
特殊场景,我这里也举例一下,原生页面webView嵌入web页面。这个时候如果在app内,用户已经登录了,就需要h5页面能够拿到用户信息,但是登录信息在app中,所以需要原生把这个信息传递给h5页面。
这个时候会有两种方法,一个是通过接口请求的方式,我们指定尽管是一个页面,在浏览器打开,但其实本质是一个get请求。所以能够通过这个接口传递数据;第二个方法就是与h5页面进行通信。
通过接口请求,这里也有讲究,直接把数据传递在url里面,这样h5页面是肯定能拿到这个数据的,但是有个问题,就是把所有信息暴露出来,只有能够拿到链接,用户信息就全部暴露了;讲到这里应该很多人想到了使用数据加密,确实加密可以防御,但并不是最好的选择(尽管这个值被加密了,url上也仍然不理想,因为url有长度限制),因为加密肯定要能够解密,不然h5页面怎么取到数据,这个时候,仍然有暴露的风险;第二种方式就是将信息传递在接口响应头里,这样除非使用抓包,不然这个信息是拿不到,也显示不出来的。
所以通常在链接上不会随意携带敏感数据,但是技术方案时,就必须要区分,这个时候,大家都会想在响应头里面存放自定义数据,因为这样就只有能把这个接口抓包获取才知道的信息,普通用户无感知。
但是普通在服务端响应头增加自定义字段,在客户端直接读取是不行的,比如下面例子
客户端直接去读取响应头(response headers)
服务端代码:
app.all("*", function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Authorization', '1234');
next();
})
app.get('/list', (req, res) => {
res.send({
list: [1,2,3,4],
code: 200
}<