浅析从axiosHTTP拦截器的设计与实现里学习如何设计通用的任务处理模型(任务注册/任务编排/任务调度)axiosHTTP适配器的设计与实现常见CSRF防御措施(检查Referer同步表单CSRFToken校验双重Cookie防御)axios自带CSRF防御的实现原理古兰精

对于大多数SPA应用程序来说,通常会使用token进行用户的身份认证。这就要求在认证通过后,我们需要在每个请求上都携带认证信息。针对这个需求,为了避免为每个请求单独处理,我们可以通过封装统一的request函数来为每个请求统一添加token信息。

那么对于这个问题,该如何解决呢?Axios为我们提供了解决方案——拦截器。Axios是一个基于Promise的HTTP客户端,而HTTP协议是基于请求和响应,所以Axios提供了请求拦截器和响应拦截器来分别处理请求和响应,它们的作用如下:

在Axios中设置拦截器很简单,通过axios.interceptors.request和axios.interceptors.response对象提供的use方法,就可以分别设置请求拦截器和响应拦截器:

//添加请求拦截器axios.interceptors.request.use(function(config){config.headers.token='addedbyinterceptor';returnconfig;});//添加响应拦截器axios.interceptors.response.use(function(data){data.data=data.data+'-modifiedbyinterceptor';returndata;});那么拦截器是如何工作的呢?在看具体的代码之前,我们先来分析一下它的设计思路。Axios的作用是用于发送HTTP请求,而请求拦截器和响应拦截器的本质都是一个实现特定功能的函数。

我们可以按照功能把发送HTTP请求拆解成不同类型的子任务,比如有用于处理请求配置对象的子任务,用于发送HTTP请求的子任务和用于处理响应对象的子任务。当我们按照指定的顺序来执行这些子任务时,就可以完成一次完整的HTTP请求。

了解完这些,接下来我们将从「任务注册、任务编排和任务调度」三个方面来分析Axios拦截器的实现。

2、任务注册

通过前面拦截器的使用示例,我们已经知道如何注册请求拦截器和响应拦截器,其中请求拦截器用于处理请求配置对象的子任务,而响应拦截器用于处理响应对象的子任务。要搞清楚任务是如何注册的,就需要了解axios和axios.interceptors对象。

//lib/axios.jsfunctioncreateInstance(defaultConfig){varcontext=newAxios(defaultConfig);varinstance=bind(Axios.prototype.request,context);//Copyaxios.prototypetoinstanceutils.extend(instance,Axios.prototype,context);//Copycontexttoinstanceutils.extend(instance,context);returninstance;}//Createthedefaultinstancetobeexportedvaraxios=createInstance(defaults);在Axios的源码中,我们找到了axios对象的定义,很明显默认的axios实例是通过createInstance方法创建的,该方法最终返回的是Axios.prototype.request函数对象。同时,我们发现了Axios的构造函数:

//lib/core/InterceptorManager.jsfunctionInterceptorManager(){this.handlers=[];}InterceptorManager.prototype.use=functionuse(fulfilled,rejected){this.handlers.push({fulfilled:fulfilled,rejected:rejected});//返回当前的索引,用于移除已注册的拦截器returnthis.handlers.length-1;};通过观察use方法,我们可知注册的拦截器都会被保存到InterceptorManager对象的handlers属性中。下面我们用一张图来总结一下Axios对象与InterceptorManager对象的内部结构与关系:

3、任务编排

现在我们已经知道如何注册拦截器任务,但仅仅注册任务是不够,我们还需要对已注册的任务进行编排,这样才能确保任务的执行顺序。这里我们把完成一次完整的HTTP请求分为处理请求配置对象、发起HTTP请求和处理响应对象3个阶段。接下来我们来看一下Axios如何发请求的:

axios({url:'/hello',method:'get',}).then(res=>{console.log('axiosres:',res)console.log('axiosres.data:',res.data)})通过前面的分析,我们已经知道axios对象对应的是Axios.prototype.request函数对象,该函数的具体实现如下:

//lib/core/Axios.jsAxios.prototype.request=functionrequest(config){config=mergeConfig(this.defaults,config);//省略部分代码varchain=[dispatchRequest,undefined];varpromise=Promise.resolve(config);//任务编排this.interceptors.request.forEach(functionunshiftRequestInterceptors(interceptor){chain.unshift(interceptor.fulfilled,interceptor.rejected);});this.interceptors.response.forEach(functionpushResponseInterceptors(interceptor){chain.push(interceptor.fulfilled,interceptor.rejected);});//任务调度while(chain.length){promise=promise.then(chain.shift(),chain.shift());}returnpromise;};任务编排的代码比较简单,我们来看一下任务编排前和任务编排后的对比图:

4、任务调度

任务编排完成后,要发起HTTP请求,我们还需要按编排后的顺序执行任务调度。在Axios中具体的调度方式很简单,具体如下所示:

//lib/core/Axios.jsAxios.prototype.request=functionrequest(config){//省略部分代码varpromise=Promise.resolve(config);while(chain.length){promise=promise.then(chain.shift(),chain.shift());}}因为chain是数组,所以通过while语句我们就可以不断地取出设置的任务,然后组装成Promise调用链从而实现任务调度,对应的处理流程如下图所示:

下面我们来回顾一下Axios拦截器完整的使用流程:

//添加请求拦截器——处理请求配置对象axios.interceptors.request.use(function(config){config.headers.token='addedbyinterceptor';returnconfig;});//添加响应拦截器——处理响应对象axios.interceptors.response.use(function(data){data.data=data.data+'-modifiedbyinterceptor';returndata;});axios({url:'/hello',method:'get',}).then(res=>{console.log('axiosres.data:',res.data)})介绍完Axios的拦截器,我们来总结一下它的优点。Axios通过提供拦截器机制,让开发者可以很容易在请求的生命周期中自定义不同的处理逻辑。此外,也可以通过拦截器机制来灵活地扩展Axios的功能,比如Axios生态中列举的axios-response-logger和axios-debug-log这两个库。

参考Axios拦截器的设计模型,我们就可以抽出以下通用的任务处理模型:

1、默认HTTP适配器

为了支持不同的环境,Axios引入了适配器。在HTTP拦截器设计部分,我们看到了一个dispatchRequest方法,该方法用于发送HTTP请求,它的具体实现如下所示:

//lib/core/dispatchRequest.jsmodule.exports=functiondispatchRequest(config){//省略部分代码varadapter=config.adapter||defaults.adapter;returnadapter(config).then(functiononAdapterResolution(response){//省略部分代码returnresponse;},functiononAdapterRejection(reason){//省略部分代码returnPromise.reject(reason);});};通过查看以上的dispatchRequest方法,我们可知Axios支持自定义适配器,同时也提供了默认的适配器。对于大多数场景,我们并不需要自定义适配器,而是直接使用默认的适配器。因此,默认的适配器就会包含浏览器和Node.js环境的适配代码,其具体的适配逻辑如下所示:

2、自定义适配器

其实除了默认的适配器外,我们还可以自定义适配器。那么如何自定义适配器呢?Axios有提供的示例,这里就不多说了,平时使用的很少。

3、图解:下面我们用一张图解释一下Axios的拦截器与适配器的处理流程

1、CSRF简介

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。

攻击者利用了Web中用户身份验证的一个漏洞:「简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的」。既然存在以上的漏洞,那么我们应该怎么进行防御呢?接下来我们来介绍一些常见的CSRF防御措施。

2、CSRF防御措施

(1)检查Referer字段

以商城操作为例,Referer字段地址通常应该是商城所在的网页地址。而如果是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,这时候服务器就能识别出恶意的访问。

这种办法简单易行,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然HTTP协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。

(2)同步表单CSRFToken校验

CSRF攻击之所以能够成功,是因为服务器无法区分正常请求和攻击请求。针对这个问题我们可以要求所有的用户请求都携带一个CSRF攻击者无法获取到的token。对于CSRF示例图中的表单攻击,我们可以使用「同步表单CSRF校验」的防御措施。

「同步表单CSRF校验」就是在返回页面时将token渲染到页面上,在form表单提交的时候通过隐藏域或者作为查询参数把CSRFtoken提交到服务器。比如,在同步渲染页面时,在表单请求中增加一个_csrf的查询参数,这样当用户在提交这个表单的时候就会将CSRFtoken提交上来:

用户名:选择头像:提交(3)双重Cookie防御

「双重Cookie防御」就是将token设置在Cookie中,在提交(POST、PUT、PATCH、DELETE)等请求时提交Cookie,并通过请求头或请求体带上Cookie中已设置的token,服务端接收到请求后,再进行对比校验。

下面我们以jQuery为例,来看一下如何设置CSRFtoken:

letcsrfToken=Cookies.get('csrfToken');functioncsrfSafeMethod(method){//以下HTTP方法不需要进行CSRF防护return(/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));}$.ajaxSetup({beforeSend:function(xhr,settings){if(!csrfSafeMethod(settings.type)&&!this.crossDomain){xhr.setRequestHeader('x-csrf-token',csrfToken);}},});介绍完CSRF攻击的方式和防御手段,最后我们来看一下Axios是如何防御CSRF攻击的。

3、AxiosCSRF防御

Axios提供了xsrfCookieName和xsrfHeaderName两个属性来分别设置CSRF的Cookie名称和HTTP请求头的名称,它们的默认值如下所示:

//lib/defaults.jsvardefaults={adapter:getDefaultAdapter(),//省略部分代码xsrfCookieName:'XSRF-TOKEN',xsrfHeaderName:'X-XSRF-TOKEN',};前面我们已经知道在不同的平台中,Axios使用不同的适配器来发送HTTP请求,这里我们以浏览器平台为例,来看一下Axios如何防御CSRF攻击:

//lib/adapters/xhr.jsmodule.exports=functionxhrAdapter(config){returnnewPromise(functiondispatchXhrRequest(resolve,reject){varrequestHeaders=config.headers;varrequest=newXMLHttpRequest();//省略部分代码//添加xsrf头部if(utils.isStandardBrowserEnv()){varxsrfValue=(config.withCredentials||isURLSameOrigin(fullPath))&&config.xsrfCookieNamecookies.read(config.xsrfCookieName):undefined;if(xsrfValue){requestHeaders[config.xsrfHeaderName]=xsrfValue;}}request.send(requestData);});};看完以上的代码,相信小伙伴们就已经知道答案了,原来Axios内部是使用「双重Cookie防御」的方案来防御CSRF攻击。

THE END
1.印度古代哲学家与宗教体系形成婆罗门阶层不仅掌握着宗教知识,还拥有高超的天文学、医学和数学知识,这些都反映出他们深厚的文化底蕴。在这种背景下,早期印度人开始探索宇宙间一切存在的事物,从而产生了一系列关于宇宙创造论的神话故事,如《吠陀经》等,这些文献记录了原始印度人的生活方式、信仰以及对自然现象理解。https://www.39et.cn/shi-jie-li-shi/463810.html
2.曼陀罗花的语言学探究解读其在古印度文化中的象征意义与语义潜流曼陀罗花的语言学探究:解读其在古印度文化中的象征意义与语义潜流 引言 在东方文化中,曼陀罗(Mandala)是一种广泛存在于佛教、印度教和藏传佛教等宗教中的神秘图形。它不仅仅是一种艺术形式,更是一个深奥的哲学概念,反映了宇宙秩序和人生目标的一种视觉表现。然而,在这片文化海洋中,曼陀罗之所以显得格外引人注目,是因https://www.dpo48j6p8.cn/jie-ri-song-hua/247446.html
3.认知封闭认知闭合心理学上把我的这一现象描述为“认知闭合需求”,简称**“认知闭合”**。 02 认知闭合的三大弊端 乍一听,你可能觉得,认知闭合不是挺好嘛? 可以给我们提供确定感,增强我们探索新领域的信心,让我们更快开始行动。 但事实上,认知闭合的弊端更多,一旦认知闭合后,我们的思考和行为往往会呈现3个偷懒倾向。 https://blog.csdn.net/u013669912/article/details/144388031
4.有球友研究过这些吗?我很想知道,又无从知晓,也无处寻找答案作者: 有球友研究过这些吗? 我很想知道,又无从知晓,也无处寻找答案。https://xueqiu.com/1919467764/316269749
5.伊玛目安萨里和他的《圣学复苏》(圣学复苏精义(全二册))书评二.伊玛目安萨里和他的《圣学复苏》 有师长讲过,伊斯兰史上荣获“伊玛目”尊称的学者不过数位。众所周知的伊玛目有四大伊玛目,布哈里,脑威,苏优蒂,冉巴尼等,这些伊玛目在教法学、圣训学、古兰学和苏菲学等领域成就显著,而伊玛目安萨里的研究领域明显更为广泛。不同于这些伊玛目更多的是在穆斯林内部得到了普遍的认可,伊https://book.douban.com/review/12601974/
6.阿拉伯语学习?有精通《古兰》的经学家,通晓教律的法学家和研究语言文学的专家等。阿依莎就是其中最为典型、最为著名的一个。甚至许多男子都向她请教有关《古兰》和教律方面的知识。 第四、伊斯兰给予妇女婚姻上的自主权。先知穆罕默德曾经说过:“不和寡妇商量,就不能和她结婚,不经少女同意,不能和她结婚。她的同意就是沉默。https://merifet.wordpress.com/
7.一零三章app下载一零三章安卓版下载v3.26.14.1110、全球42个语种的《古兰经》译本,软件支持14个国家语言。 软件更新 v3.0.7.0更新内容: 1、计算当地礼拜时间、礼拜朝向; 2、自定义设置修改礼拜准备时间、礼拜时间及闹铃提醒; 3、月相查看,斋月礼拜时间封斋开斋时间表; 4、“法赫德国王古兰经印制厂”官方电子版《古兰经》; 5、多位《古兰经》诵读https://shouyou.3dmgame.com/android/43905.html
8.古兰学问答(一)中国穆斯林摘要:古兰学是伊斯兰教的基本学科之一。该学科以《古兰经》为研究对象,内容主要包括:经文的降示背景,经文的记录,经文的收集,经文的整理、定版,经文的不同读法,经文中的故事及其哲理以及对经文的研究和注释等。同时包括各个时代围绕《古兰经》的天启性、无始性和不可拟作性等问题争论的答辩。 https://www.xueshu.com/zgmsl/201804/34008134.html
9.学习古兰经学习 古兰经你可能也会喜欢 Elif ba - Kur'an reniyorumhttps://apps.apple.com/us/app/%E5%AD%A6%E4%B9%A0-%E5%8F%A4%E5%85%B0%E7%BB%8F/id1345955361?l=zh&see-all=customers-also-bought-apps
10.学习古兰经APP下载安装2024最新正版手机免费下载让我们开始学习古兰经,古兰经》是伊斯兰教唯一根本经典;是先知穆罕默德在复兴伊斯兰过程中陆续宣布的安拉启示的汇集。 分类: 考试学习学习 01 UC浏览器 系统工具|109.95MB 02 淘宝-天猫双11全球狂欢季 58.77MB 03 QQ 307.03MB 04 抖音 264.83MB 05 https://www.25pp.com/xiazai/5874785/
11.学习古兰经相似应用下载梦幻般的开局,对于初学者来说,想学习阿拉伯语神圣的古兰经。有15个章节在安帕拉的部分,非常详细,透彻。每章打破起伏分为几个阶段,从简单到复杂的构词,这个应用程序及一些奉献精神,你一定会流利地阅读“古兰经”。 更多 网友评论更多 下载豌豆荚,参与网友评论互动 暂无评论 应用下载排行榜 UC浏览器 109.61https://m.wandoujia.com/apps/2268061
12.是您学习古兰经和阿拉伯文的理想选择的英文翻译英语怎么说海词词典,最权威的学习词典,专业出版是您学习古兰经和阿拉伯文的理想选择的英文,是您学习古兰经和阿拉伯文的理想选择翻译,是您学习古兰经和阿拉伯文的理想选择英语怎么说等详细讲解。海词词典:学习变容易,记忆很深刻。http://dict.cn/%E6%98%AF%E6%82%A8%E5%AD%A6%E4%B9%A0%E5%8F%A4%E5%85%B0%E7%BB%8F%E5%92%8C%E9%98%BF%E6%8B%89%E4%BC%AF%E6%96%87%E7%9A%84%E7%90%86%E6%83%B3%E9%80%89%E6%8B%A9
13.古兰诵读(Quran)app下载古兰诵读(Quran)手机版下载v3.9.62、阅读体验非常好,提供自定义字体、方向、图案,可以下载,在舒适的状态下阅读。 3、《古兰经》被翻译成多种语言,所以你可以选择你能读的语言。 4、操作简单,易学,熟练使用,无负担。 上面就是这次介绍的全部内容了,想了解更多关于古兰诵读( Quran)app的内容请持续关注1666手游网!小编会及时进行更新哦!http://www.1666.com/sjrj/v482405.html
14.古兰诵读安卓下载古兰诵读app官方版v8.5.13、 古兰诵读App提供了全面的课程,让您能够更好、更快、更方便地正确诵读古兰经。 软件说明 1、精选经典:古兰诵读app收录众多知名古兰经,包括《古兰经》、《哈莱姆考古》、《解释古兰经》等多款资料。让用户可以一站式便捷地学习、背诵古兰经。 2、多功能性:软件集听、读、学于一体,除了可以听经读经之外,还有https://m.ggzha.com/az/81173.html