我正在使用Angular 4的HTTPClient模块从数据库中检索数据。 相应的服务有以下方法,
getPosts() {
const httpHeaders = new HttpHeaders().set('Content-Type', 'application/json');
// tslint:disable-next-line:max-line-length
httpHeaders.set('Authorization for JWT', 'Token');
return this.http.get('http://localhost:9090/api/user' + '?user_id=' + this.user.id.toString(),
{headers: httpHeaders,
responseType: 'json'});
}
我从一个组件调用此方法,如下所示,
this.Servie.getPosts().subscribe(pos => {
console.log(pos);
});
但是我在服务器端收到如下错误,
java.lang.RuntimeException:缺少JWT令牌
客户端错误,
无法加载http://localhost:9090/api/user?user_id=1:响应 预检具有无效的HTTP状态代码500。
请纠正我哪里出错了?
我根据下面的讨论进行了更改,但问题仍然如下, 我想我现在搞砸了,我做了如下以下修改,这是在服务中编写的代码,
const httpHeaders = new HttpHeaders()
.set('Content-Type', 'application/json')
// tslint:disable-next-line:max-line-length
.set('RequestAuthorization', 'Bearer ' + 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI5ODg0NjUxMjMzIiwidXNlcklkIjoiNSJ9.gwiZcx5I8rInXJGANvS9twupXjdjrzFdZNZ0K85u-KA8LXXDgDf27mUzUoiEyxRMg');
return this.http.get('http://localhost:9090/user' + '?user_id=' + this.user.id.toString(),
{headers: httpHeaders});
我打电话给上述服务如下,
this.userServie.getPosts().map((res: Response) =>
console.log(res.text()));
但服务没有达成,我没有在浏览器开发工具的网络选项卡中看到GET方法。哪里错了?请纠正我。
答案 0 :(得分:1)
标题已定义了值。
httpHeaders.set('Authorization for JWT', 'Token');
应该是
httpHeaders.set('Authorization', 'Bearer ' + token);
如果您向服务器提供随机令牌,当然它会告诉您该令牌丢失。在您的情况下,您发送此
Authorization for JWT --> Token
答案 1 :(得分:0)
一旦你弄清楚要发送的真实标题,我认为你会遇到两个问题:
问题#1
HttpHeaders
类是不可变的
所以你需要这样的东西
const httpHeaders = new HttpHeaders()
.set('Content-Type', 'application/json')
.set('Authorization', 'Bearer [yourTokenHere]')
而不是声明httpHeaders
并在不链接呼叫的情况下调用set
const httpHeaders = new HttpHeaders();
//The line below has no effect on the httpHeaders instance
httpHeaders.set('Authorization', 'Bearer [yourTokenHere]');
问题#2
另外,您确定在Java服务器上正确配置了CORS吗?
您收到有关preflight
请求丢失令牌的错误(即使用Options方法的请求)。 AFAIK,浏览器不会为预检请求发送Authorization
等自定义标头。因此,服务器不应该检查令牌的OPTIONS请求(否则,你将总是得到401因为将不会发送令牌)