【发布时间】:2018-04-13 14:48:28
【问题描述】:
您好,我正在使用带有 Angular 的 Ionic 2 框架,我想使用授权标头发出 http 请求,但它似乎没有发送标头。我做错了什么?
@Injectable()
export class UserServiceProvider {
private loginSuccess: any;
constructor(public http: Http) {
console.log('Hello UserServiceProvider Provider');
}
login(username, password)
{
var token = btoa(username + ':' + password);
alert(token);
this.loginSuccess = false;
let headers = new Headers();
headers.append('Authorization', 'Basic ' + token);
this.http.get('http://localhost:8080/HelloWorld/api/login/try', {
headers: headers
})
.subscribe(function success(response) {
this.loginSuccess = true;
}, function error(response) {
this.loginSuccess = false;
});
return this.loginSuccess;
}
}
这是浏览器控制台中的响应
polyfills.js:3 OPTIONS http://localhost:8080/HelloWorld/api/login/try 401 ()
s @ polyfills.js:3
t.scheduleTask @ polyfills.js:3
onScheduleTask @ polyfills.js:3
t.scheduleTask @ polyfills.js:3
r.scheduleTask @ polyfills.js:3
r.scheduleMacroTask @ polyfills.js:3
(anonymous) @ polyfills.js:3
o.(anonymous function) @ polyfills.js:2
(anonymous) @ http.es5.js:1275
Observable._trySubscribe @ Observable.js:171
Observable.subscribe @ Observable.js:159
webpackJsonp.197.UserServiceProvider.login @ user-service.ts:29
webpackJsonp.196.AccountPage.login @ account.ts:21
(anonymous) @ AccountPage.html:25
handleEvent @ core.es5.js:12022
callWithDebugContext @ core.es5.js:13486
debugHandleEvent @ core.es5.js:13074
dispatchEvent @ core.es5.js:8615
(anonymous) @ core.es5.js:9226
(anonymous) @ platform-browser.es5.js:2651
t.invokeTask @ polyfills.js:3
onInvokeTask @ core.es5.js:3881
t.invokeTask @ polyfills.js:3
r.runTask @ polyfills.js:3
e.invokeTask @ polyfills.js:3
p @ polyfills.js:2
v @ polyfills.js:2
(index):1 加载失败 http://localhost:8080/HelloWorld/api/login/try: 预检响应 具有无效的 HTTP 状态代码 401
【问题讨论】:
-
@Deniel McCarthy :附上正在发送到服务器的请求的屏幕截图。还有一点,你好像在登录,如果是这样,那么登录时最常用的方法是 POST 而不是 GET。
-
我已将回复添加到我认为 POST 或 GET 不会产生影响的帖子中。这不是 HTML 表单,这是 Http 基本身份验证
-
请检查 CORS 问题,因为预检失败。
-
@DanielMcCarthy 请检查我编辑的答案,其中我添加了过滤方法来克服 CORS 问题。
-
问题中显示的错误消息是针对浏览器在尝试从您的代码发出 GET 请求之前自动发送的 CORS 预检选项的响应。 CORS 协议要求预检 OPTIONS 请求中不包含任何凭据,因此浏览器不会从您的代码中发送 Authorization 标头。但是您发送该请求的服务器配置错误,即使对于 OPTIONS 请求也需要身份验证。所以服务器发送一个 401 响应拒绝请求并且预检失败并且浏览器停在那里并且永远不会尝试您的 GET。
标签: angular ionic-framework cors http-authentication preflight