当前位置: 首页 > 知识库问答 >
问题:

角4中使用超文本传输协议get方法丢失JWT令牌

呼延聪
2023-03-14

我使用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方法。我错了吗?请纠正我。

共有2个答案

宋臻
2023-03-14

一旦你弄清楚了要发送的真正标题,我想你会有2个问题:

问题#1

< code>HttpHeaders类是不可变的

所以你需要有这样的东西

const httpHeaders = new HttpHeaders()
.set('Content-Type', 'application/json')
.set('Authorization', 'Bearer [yourTokenHere]')

而不是声明<code>httpHeaders

const httpHeaders = new HttpHeaders();
//The line below has no effect on the httpHeaders instance
httpHeaders.set('Authorization', 'Bearer [yourTokenHere]');

第2期

此外,您是否确保在java服务器上正确配置了CORS?

您收到有关预检请求(即具有 Options 方法的请求)缺少令牌的错误。AFAIK,浏览器不会发送自定义标头,例如预检请求的授权。因此,服务器不应检查 OPTIONS 请求的令牌(否则,您最终将始终获得 401,因为不会发送令牌)

滕夜洛
2023-03-14

标头已定义值。

httpHeaders.set('Authorization for JWT', 'Token');

应该是

httpHeaders.set('Authorization', 'Bearer ' + token);

如果您向服务器提供随机令牌,它当然会告诉您令牌丢失。在你的情况下,你发送这个

Authorization for JWT --> Token
 类似资料:
  • 我想知道你对这个概念的看法/意见。如果有替代方案?这是否可行/有益? 据我所知,对于每个http请求,服务器都会执行一些操作并返回http响应。 现在考虑任何场景,我们希望对服务器上运行的进程有更多的控制。 情景1:http请求发送- 在这里,资源被浪费了。 情况2:http请求发送- 在这里,客户端不知道服务器中运行的进程的状态。客户端必须等待,直到它获得超文本传输协议响应。 我的想法是:在初始

  • 尝试从Angular 8应用程序调用服务时出错。服务内容如下: 下面是Java rest api(从浏览器调用时工作正常): 我在chrome控制台中发现错误: 错误:{error:SyntaxError:JSON中位于XMLHtt处JSON.parse()位置0处的意外标记A…,文本:“AAA BBB CCC”}头:HttpHeaders{normalizedNames:Map(0),lazyU

  • 我尝试使用以下方法从Api获取json数据 我将这个物体建模如下 数据如下: 当我尝试使用模型访问时,我收到错误“\u InternalLinkedHashMap”

  • Graphdb Free 7使用哪种类型的超文本传输协议验证方法?我已经通过GraphDB自由工作台设置了一个用户并启用了安全性,并试图使用基本的超文本传输协议验证来查询我的三重存储,但只得到403:禁止响应。

  • 我试图禁用我的AngularJS应用程序中的缓存,但它无法使用以下代码: 当我使用

  • 我正在使用oauth签名生成我的oauth签名,以便与woocommerce api连接。我遵循了woocommerce rest api文档中所述的所有步骤: 所需的参数是:oauth_consumer_密钥、oauth_时间戳、oauth_nonce、oauth_签名和oauth_签名方法。oauth_版本不是必需的,应该省略。OAuth nonce可以是消费者密钥唯一的任意随机生成的32个字