【问题标题】:When reload the page error 401 is thrown, i'm using Angular 5当重新加载页面错误 401 时,我正在使用 Angular 5
【发布时间】:2021-02-11 12:12:21
【问题描述】:

我使用SpringBoot和JWT生成认证token,浏览链接访问页面时没有报错,但是重新加载页面时出现401错误,以下是流程

过程正常:

GENERAL:
Request URL: http://localhost:8080/corridas/aposta?idUsuario=10&size=5&page=0&sort=id,desc
Referrer Policy: strict-origin-when-cross-origin

Response Headers:
Access-Control-Allow-Credentials: true
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: keep-alive
Content-Type: application/json
Date: Thu, 29 Oct 2020 03:02:54 GMT
Expires: 0
Keep-Alive: timeout=60
Pragma: no-cache
Transfer-Encoding: chunked
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

Request Headers:
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7
Authorization: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ1c3VhcmlvNEB0ZXN0ZS5jb20uYnIiLCJjcmVhdGVkIjoxNjAzOTM3ODY2NTMyLCJleHAiOjE2MDQ1NDI2NjZ9.C-kbadiNZpcKrFgX7kiymJQfigmHe9ZKIGLlMYxYiZaLBbf0P-JY271hV0Tx2toV3I9ZemyGVwgaAp2tDQNF-A
Connection: keep-alive
Cookie: usuario=Fantasma; token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ1c3VhcmlvNEB0ZXN0ZS5jb20uYnIiLCJjcmVhdGVkIjoxNjAzOTM3ODY2NTMyLCJleHAiOjE2MDQ1NDI2NjZ9.C-kbadiNZpcKrFgX7kiymJQfigmHe9ZKIGLlMYxYiZaLBbf0P-JY271hV0Tx2toV3I9ZemyGVwgaAp2tDQNF-A;
Host: localhost:8080
Referer: http://localhost:8080/corridas/torcida
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like     Gecko) Chrome/86.0.4240.111 Mobile Safari/537.36   

重新加载页面后处理 401

General:
Request URL: http://localhost:8080/corridas/aposta?idUsuario=10&size=5&page=0&sort=id,desc
Request Method: GET
Status Code: 401 
Remote Address: [::1]:8080
Referrer Policy: strict-origin-when-cross-origin

Response Headers:
Access-Control-Allow-Credentials: true
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: keep-alive
Content-Language: pt-BR
Content-Length: 301
Content-Type: text/html;charset=UTF-8
Date: Thu, 29 Oct 2020 03:03:54 GMT
Expires: 0
Keep-Alive: timeout=60
Pragma: no-cache
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

Request Headers:
Accept:     text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
Cookie: usuario=Fantasma; token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ1c3VhcmlvNEB0ZXN0ZS5jb20uYnIiLCJjcmVhdGVkIjoxNjAzOTM3ODY2NTMyLCJleHAiOjE2MDQ1NDI2NjZ9.C-kbadiNZpcKrFgX7kiymJQfigmHe9ZKIGLlMYxYiZaLBbf0P-JY271hV0Tx2toV3I9ZemyGVwgaAp2tDQNF-A;
Host: localhost:8080
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like     Gecko) Chrome/86.0.4240.111 Mobile Safari/537.36

这里是角度拦截器

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>  {
    let authRequest: any;
    if (this.shared.isLoggedIn()){
        authRequest = req.clone({
            setHeaders: {
                'Authorization': this.shared.buscaChaveUsuario()
            }
        });
        return next.handle(authRequest);
    } else {
        return next.handle(req);
    }
}

当我通过网站链接访问页面时总是调用拦截器,当我重新加载页面时没有调用拦截器,我相信错误一定是在这一点上,可以在第一个看到过程我通过'Authorization'标头传递令牌,在第二个过程中,启动401错误,'Authorization'标头没有通过,因为没有调用拦截器,简而言之,有没有人有任何线索这个错误的原因是什么?

【问题讨论】:

  • 在哪里以及如何在应用中添加绑定拦截器?
  • @Crocsx 你好,Crocsx,很抱歉响应延迟,但是来吧,拦截器正在 app.module 的提供者中使用,下面是它的调用方式。 . . code providers: [SharedService, AuthGuard, { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },

标签: javascript java angular typescript spring-boot


【解决方案1】:

您已经提到拦截器没有被调用,但我认为拦截器每次都被调用,而不是下面的代码部分正在创建问题。

if (this.shared.isLoggedIn()){
    authRequest = req.clone({
        setHeaders: {
            'Authorization': this.shared.buscaChaveUsuario()
        }
    });
    return next.handle(authRequest);

}

isLoggedIn()buscaChaveUsuario() 函数从应用程序中存在的一些变量(即 Angular 项目)中获取值。因此,当我们刷新页面时,应用程序将重新加载,这些变量将被清除,当调用再次进入拦截器时,值将不会出现在那里,这就是重新加载时“授权”标头不存在的原因。

您可以尝试的一个快速解决方案是将这些值放在浏览器的 localStorage 中,这样在重新加载时不会被清除,并在用户注销时从 localStorage 中删除这些值。

【讨论】:

  • @Manoj 所以,很抱歉延迟响应,我在这里做了一个测试,登录后我将令牌添加到本地存储:。 localStorage.setItem('token', this.shared.token); 。在拦截器上,我将 localStorage 值作为“授权”参数传递,. Authorization': localStorage.getItem ('token') 但错误继续存在,当我进入浏览链接的页面时,如果我更新或尝试访问直接页面,一切正常。在调试代码时,只有在我浏览链接时才会调用拦截器,当我更新页面时,不会调用拦截器。
  • @RonaldCalazans 你能确认你只导入了一次HttpClientModule,正如这篇文章stackoverflow.com/questions/50860293/…中所指定的那样
  • 你好@AJcodes,所以,在阅读了推荐我的帖子后,我查看了我的代码,我只使用了一个“HttpClientModule”......页面重新加载在某些情况下正在工作在开发过程中这个功能坏了,我实现了一个 AuthGuard 来向登录页面发送未经身份验证的访问,它正在工作,系统现在破坏了 AuthGuard,它不再工作了......正如我在当我尝试重新加载页面或尝试通过直接链接访问页面(例如:localhost:8080 / runnings / events)时的主帖子给出错误 401
  • 我找到了错误的点,但是我没有找到解决办法嘿嘿...我是把前端和后端打包在同一个.war里,我做了一个测试,我上去了前端在4200端口,后端在8080端口,这样我可以重新加载页面,如果我从.war运行前端我不能重新加载页面,有什么提示吗?
【解决方案2】:

有几种处理方法。

实例: 我建议您第一次成功登录网站时,可以将 jwt 令牌存储在浏览器存储中。

IE 用户在mysite.com/login 中提供了一些有效凭据,如果凭据正常,您的站点会将这些凭据存储在浏览器存储中,并假设网络的默认行为是成功登录时,它应该将用户重定向到 mysite.com/home。

现在,您可以使用Angular Guard 来保护您的 mysite.com/home 路由,该路由实质上可以检查会话存储中是否存在有效的、未过期的令牌。如果没有,则在守卫上返回 false 并重定向到禁止页面。

【讨论】:

  • 抱歉回复晚了,谢谢你的回复:),系统的行为正是你所建议的:如果我登录,该人将被定向到“家”通过单击打开页面的按钮进行导航,但是如果我重新加载页面总是给出错误 401,我无法重新加载任何页面,我还实施了 AuthGuard 以防止在此人未登录时进行未经授权的访问。
猜你喜欢
  • 2020-06-22
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2020-04-09
  • 1970-01-01
  • 2019-05-17
相关资源
最近更新 更多