java - 前端和后端分开部署的 Cookie 的使用(域)
问题描述
我研究了超过 2 天找不到解决方案。让我解释一下问题,
我有一个应用程序,其中 UI 使用 Angular 7 实现,后端使用 Java Spring。
它们都分别部署在不同的域中。假设 Angular 应用程序部署在ang.ui.com中,Java部署在java.back.com中。
所有都是 REST Api,包括登录。Cookies 被用于存储JWT 令牌而不是本地存储。我已经包含了双方的 CORS 配置并且能够成功登录。
由于两者是分开部署的,Java 应用程序在过滤时无法获取 JWT Cookie。
请帮助我我需要遵循什么方法。
解决方案
服务器将无法从前端读取 cookie,您必须在发送的每个 HTTP 请求中发送存储在 cookie 中的令牌,最好是在 Authorization 标头中。
一种方法是使用 Angular 拦截器。让我们通过创建一个名为的新文件来创建一个新的拦截器jwt.interceptor.ts
我们的拦截器类将被调用JwtInterceptor
,它必须实现 AngularHttpInterceptor
接口。@Injectable
我们将通过添加注释使其可注入。
我们的类应该是这样的:
@Injectable()
export class JwtInterceptor implements HttpInterceptor {
}
现在我们必须实现intercept
我们发送的每个 http 请求都会执行的方法。它有一个HttpRequest
和一个HttpHandler
参数,它返回一个HttpEvent
可观察的。
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
}
在这个方法中,我们必须从我们的 cookie 中读取令牌(假设它被称为jwtCookie
)并添加到Authorization
我们的HttpRequest
标题部分。假设您已经知道如何使用 cookie 服务,我将不再继续。我们通过使用来检索令牌var token = cookie.get("jwtCookie");
让我们验证 cookie 是否存在:if(token) {}
现在我们通过克隆请求对象并设置 Authorization 标头将我们的令牌添加到标头中:
request = request.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
现在我们只需要通过调用和返回来处理请求next.handle(request)
。
现在我们的类应该是这样的:
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable()
export class JwtInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler):Observable<HttpEvent<any>> {
var token = cookie.get("jwtCookie);
if(token) {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
}
return next.handle(request);
}
}
现在我们必须通过编辑app.module.ts
文件来注入我们的拦截器 首先导入类:import { JwtInterceptor } from './jwt.interceptor';
然后将以下对象添加到注解中的providers
数组中:@NgModule
{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true }
现在我们的令牌将被添加到我们的 Angular 应用程序发送的每个请求中,并且我们的 JAVA 服务器可以读取它。
推荐阅读
- html - 由于不允许的 MIME 类型(“text/html”)而被阻止
- php - QuestDB SELECT 返回特殊字符,但 Postgres 不
- python - pandas.DataFrame.value_counts :如何根据单独的列表对结果进行排序?
- python - 传递到下一个函数时回溯未满
- c# - 如何将 Azure Application Insights for Asp.Net Core 5.0 配置为仅发送 4% 的请求和 100% 的异常?
- visual-studio-code - VS Code ESLint 检查快速修复...不工作
- kotlin - 如何在 Kotlin 中创建静态函数而不创建对象
- node.js - Mongoose 因 $in 失败:[数字数组]
- nginx - 在 NGINX 中解析 HTTP 基本授权标头
- python - 在 Python 上使用 BeautifulSoup 的 Webscraper