如何拦截Dojo框架应用的HTTP请求并添加CSRF Token
在Dojo框架中全局拦截HTTP请求并添加CSRF Token
方法一:使用Dojo请求拦截器(Interceptor)
Dojo的dojo/request模块支持通过全局拦截器统一处理所有请求,这是官方推荐的全局请求修改方式。
- 先实现CSRF Token的获取逻辑,示例从页面meta标签获取(根据后端实际存储方式调整,比如从cookie解析):
function getCsrfToken() { const metaEl = document.querySelector('meta[name="csrf-token"]'); return metaEl ? metaEl.getAttribute('content') : ''; }
- 创建拦截器并全局注册:
require(['dojo/request', 'dojo/request/default'], function(request, defaultRequest) { const csrfInterceptor = function(url, options) { // 仅对修改型请求添加Token,GET请求通常无需CSRF保护 if (options.method && /POST|PUT|DELETE|PATCH/i.test(options.method)) { options.headers = options.headers || {}; // Header名称需和后端约定一致,比如X-CSRF-Token或X-XSRF-TOKEN options.headers['X-CSRF-Token'] = getCsrfToken(); } return request(url, options); }; // 将拦截器设置为默认请求处理逻辑 defaultRequest.setDefaultInterceptor(csrfInterceptor); });
方法二:使用dojo/aspect切面拦截底层请求方法
如果需要更底层的拦截(比如兼容旧版Dojo或自定义请求实现),可以用dojo/aspect来拦截请求发送的核心方法:
require(['dojo/aspect', 'dojo/request/xhr'], function(aspect, xhr) { // 拦截xhr模块的send方法 aspect.around(xhr, 'send', function(originalSend) { return function(url, options) { if (options.method && /POST|PUT|DELETE|PATCH/i.test(options.method)) { options.headers = options.headers || {}; options.headers['X-CSRF-Token'] = getCsrfToken(); } // 调用原请求方法 return originalSend.call(xhr, url, options); }; }); });
关键注意事项
- Token一致性:前端获取Token的方式必须和后端生成、校验的方式匹配,比如后端将Token存到
XSRF-TOKENcookie中,前端就要从cookie解析:function getCsrfToken() { return document.cookie.split('; ').find(row => row.startsWith('XSRF-TOKEN='))?.split('=')[1] || ''; } - 请求类型过滤:GET请求一般不需要CSRF保护,避免不必要的Header添加。
- 版本适配:上述代码针对Dojo 1.x,Dojo 2.x(@dojo/core/request)的拦截器配置逻辑类似,但模块导入路径和API细节有差异,需对应调整。
- 跨域请求例外:如果应用使用JSONP(
dojo/request/script)这类跨域GET请求,无需添加CSRF Token,这类场景的CSRF保护需依赖其他机制。
内容的提问来源于stack exchange,提问作者Amit Pokhrel
相关产品推荐
相关产品推荐

