fetch 作为下一代web app与服务端通信的方法,尽管尚未得到某些主流浏览器的支持,比如苹果,但是由于其简易干净的语法以及强大的功能逐步成为前端工程师的选项.
传统的XHR的通信方法基于其又臭又长的语法,在诸多js框架中都会对其进行封装比如jquery的$.ajax(),angularjs的$http, 但是无论是哪种框架的封装都没有在根本上解决困扰工程师开发过程中遇到的跨域问题,尤其是在今天前后端分离的开发时代.而fetch则不存在这样的跨域问题.
所以当跨域这个坑解决之后,很多工程师还没有思考如何解决安全问题的时候,一开发就掉入到另一个坑.credentials属性.
顾名思义credentials是指认证授权,既然fetch()方法艺高人胆大地开放跨域请求,就必然对安全问题做了新的设置.在普通的ajax,或者原生的XHR请求中,cookies值是默认发送给服务端的,而服务端往往通过对cookies中的uid进行session取值,对当前用户是否处于登录状态进行判断,而在fetch()方法中credentials属性进行了默认封杀cookies发送,这样开发者会发现,说好的登录验证呢?怎么服务器端无法对我的登录进行判断?因为后台的哥们连cookies都没有获取到,伦家又怎么会知道你的uid呢?
credentials有三个属性:
omit: 不发送cookies给服务器,作为默认属性;
same-origin: 必须在同源下才可以发送,跨域则不行;
include: 无论什么情况下都可以;
所以我们在开发环境下一般设置为include,产品发布后使用same-origin,当然如果不使用session会话进行登录注册验证则直接默认关闭.
好了,最后来一波.版权所属:上海能源区块链实验室前端踏坑专业组