我试图在发送之前拦截来自Extjs应用程序的所有请求,POST和GET,然后操作网址并添加一个新的头,授权:持有者XYZ123。
我有这样的代码:
Ext.data.Connection.override({
request: function (options) {
var me = this;
this.cors = true;
this.useDefaultHeader = false;
this.useDefaultXhrHeader = false;
options.headers = { "Authorization": "Bearer VAROIS1iOiJKV1QiLCJh" };
var separator = options.url.indexOf('/') == 0 ? "" : "/";
options.url = UrlAPIPrefix + separator + options.url;
return me.callOverridden(arguments);
}
});
但是当我尝试使用它时,头部Authorization在GET和POST两种情况下都没有发送。使用POST时不发送参数。如果将代码调试到Extjs文件中,我可以看到参数,但在chrome请求头上看不到它,请参见图片。
如果有人知道如何在一个地方做这件事,如果你能帮助我,我将很高兴。
发布于 2018-01-13 17:16:06
这是因为Ext.Ajax
- Ext.data.Connection
的单例-用于框架中的大多数请求,覆盖后者不会影响前者。这种覆盖行为在extjs 5中进行了更改,并且是Sencha所设计的。
取而代之的是你需要的:
Ext.Ajax.setWithCredentials(true);
Ext.Ajax.on({
beforerequest: function(conn, options) {
options.headers = options.headers || {};
options.headers['Authorization'] = 'Bearer VAROIS1iOiJKV1QiLCJh';
},
requestexception: function(conn, response, options) {
Ext.Error.raise('...');
}
});
并且不要将令牌硬编码到您的javascript中!
发布于 2018-01-13 04:20:34
我没有覆盖这个类,而是创建了一个bootstrap类来设置ajax拦截器。在Application.launch()方法中调用Bootstrap.init()。
Ext.define('MyApp.Bootstrap', {
singleton : true,
init: function() {
Ext.Ajax.on({
beforerequest: function(conn, opts){
if(opts.url && Ext.String.startsWith(opts.url, '/')) {
return;
}
if(opts.url && !Ext.String.startsWith(opts.url, MyApp.Config.SERVER_CONTEXT)) {
opts.url = MyApp.Config.SERVER_CONTEXT + opts.url;
}
var clientId = MyApp.getApplication().clientId;
opts.headers = Ext.apply({'X-Client-Id': clientId}, opts.headers);
Ext.log('Sending Request to : ', opts.url);
}
});
}
});
https://stackoverflow.com/questions/48233340
复制相似问题