我有一个登录页面,它将用户凭证提交给登录控制器。 但在授权用户之前,我需要“打开”一个会话并接收一个有效的sessionID。
但是,我的主要问题是处理下面调用的this.openUserSession
API错误事件。也就是说,我在$http.error()
事件上返回了一个$q.reject()
,但它并不像我所期望的那样冒泡。
这里的流量:
1)用户输入凭据并单击“登录”按钮,它调用到LoginCtrl
功能loginUser()
2)我立即打电话给荷兰国际集团userService.initUserSession
得到一个有效的会话ID 。
3)如果成功的话,那么调入loginService.authUser
4)如果无效的会话ID,然后我需要返回$q.reject
和显示信息 “无法打开用户会话”
*****代码的细节** ***
注意,第一个我 “初始化” 在that.initRzr
的应用程序,然后我打电话下面that.openUserSession
:
this.initUserSession = function initSession($rootScope, username) {
var deferred = $q.defer();
deferred.notify("Establishing Session ID...");
$rootScope.userID = username;
var that = this;
this.getRazorInitParams().then(function (razorEnvJson) {
\t
\t that.initRzr(razorEnvJson).then(function (data) {
\t \t
\t \t if (data.status.match(/SUCCESS/g)) {
\t \t \t
\t \t \t // ******** OPEN USER SESSION ***********
\t \t \t that.openUserSession(razorEnvJson).then(function (data) {
\t \t \t \t // ... some code omitted here.
\t \t \t \t deferred.resolve(sessionID);
\t \t \t \t return sessionID;
\t \t \t });
\t \t }
\t }, function (error) {
// *** I NEVER HIT LINE !!! ***
\t \t deferred.reject('Could not open user session.');
\t });
});
return deferred.promise;
}
**** OPEN用户会话***
注:我在这里打了.error()
代码,因为我可以看到控制台登录消息“无法通过API开放用户会话CAL ... ”。但是,处理似乎停止在这里,我的登录屏幕冻结与微调图标。
this.openUserSession = function (razorEnvParams) {
\t // init some variables here...
\t
\t var url = "http://" + _domain + ":" + _port + controllerpath + "?userid=" + user + "&pass=" + pass;
\t var deferred = $q.defer();
\t deferred.notify("Opening user session..."); \t
\t
\t $http({
\t \t method: 'GET',
\t \t encoding: 'JSON',
\t \t headers: {
\t \t \t 'Access-Control-Allow-Origin': 'true',
\t \t \t 'Content-Type': 'application/json'
\t \t },
\t \t withCredentials: true,
\t \t url: url
\t }).success(function (data, status, headers, config) { \t \t
\t \t deferred.resolve(data);
\t }).error(function (data, status, headers, config) {
\t \t console.log("Cannot open a user session via api call. Errors details: " + data);
\t \t deferred.reject("Could not open a user session.");
\t });
\t return deferred.promise;
}
我会尝试,如果不清楚,以改善这个职位。请告知...
在此先感谢。
鲍勃
**** ****更新
按以下JB Nizet的回答,我缺少的that.openUserSession
错误回调。我在下面添加function(error)
,它按预期工作。
我现在将继续推进JB发布的链接建议。
this.initUserSession = function initSession($rootScope, username) { // ESTABLISH A RAGE CONNECTION AND SESSION ID !
var deferred = $q.defer();
deferred.notify("Establishing Rage Session ID...");
var that = this;
this.getRazorInitParams().then(function (razorEnvJson) {
\t that.initRazor(razorEnvJson).then(function (data) {
\t \t
\t \t if (data.status.match(/SUCCESS/g)) {
\t \t \t that.openUserSession(razorEnvJson).then(function (data) {
\t \t \t \t
\t \t \t \t deferred.resolve(sessionID);
\t \t \t \t return sessionID;
\t \t \t }, function (error) {
\t \t \t \t deferred.reject('Could not open user session.');
\t \t \t });
\t \t }
\t }, function (error) { // **** ADDED ERROR HANDLING ***
\t \t deferred.reject('Could not initial a user session.');
\t });
});
return deferred.promise;
}
绝对同意re:GET请求。这仍然处于开发模式,并且安全过程很快就会彻底改变。如上所述 –
。我没有回拨。它现在可以工作,我已经添加了'function(error)'到'that.openUserSession'。我也将继续重新编码,以遵守链接原则。 –
我也使用POST来处理其他事情,所以我刚刚完成将此GET转换为POST。如果我使用'data:{..}',但是使用'params {..}',它会起作用'由于我使用了'JObject' - ex /'public HttpResponseMessage Post JObject dashboardObj)'。 JObject基本上显示一个空值。我会为此创建另一个帖子,因为这是一个非常重要的变化。 –