我正在运行一个带有Sping Boot MVCAPI和Keycloak的Angular应用程序。我按照https://www.npmjs.com/package/keycloak-angular下的说明配置了Angular,它通常工作正常。
在我的Angular组件中,我使用img
标记来包含图像,这些图像由我的 Boot 应用程序提供
<img *ngIf="id" src="api/v1/profile/image/{{id}}">
MVC端点如下所示:
@GetMapping(value = "profile/image/{id}")
public @ResponseBody byte[] getProfileImage(@AuthenticationPrincipal Jwt jwt, @PathVariable String id)
throws IOException {
...
}
问题是我在第一次加载映像时收到401响应代码。
以下是我的主要发现:
- 映像的加载不(从不)包含“授权:bearer ...”请求报头(与通过
HttpClient
发送的请求相反) - 第一个失败的请求将具有
set-cookie
响应标头 - 连续请求将包含cookie作为请求标头的一部分,并且将有效
有谁能指出我能做什么吗?keycloak能被配置成这样吗?图像的加载将包含承载者认证报头。
3条答案
按热度按时间cigdeys31#
这种图像是由浏览器加载的,而不是由
HttpClient
加载的。而且HttpClient
已经配置为在您的情况下注入Authorization
标头,而不是浏览器,所以这是问题的根本原因。您可以使用
HttpClient
从URLapi/v1/profile/image/{{id}}
加载图像内容,然后使用base64编码将该图像内容内联到HTML中:这是一个很好的解决方案,小图像(这种方法通常用于社会图标)。
或者您可以在创建图像之前将授权保存到cookie中,格式与您的服务提供商所期望的格式相同)。然后浏览器将在每个请求中发送该授权cookie。当然,跨域cookie可能会有问题。
brjng4g32#
Angular功能强大,足以满足您的服务器需求,您可以强制
img
标记通过HttpClient
请求图像。因此,从编写一个管道开始,它接受图像URL并执行HTTP请求 *,同时放置Authorization头 *。
管道可以如下所示:
您还需要将
blob
响应转换为base64
字符串,以便将其传递给src
属性。然后将base64
字符串放入Promise
中,以便可以依次传递给async
管道。这里我们提供了它们以及错误处理(服务器错误,如40X,50X),使用 fallback image:这样,你就可以用这样的词:
您还可以为新版本的
img
标记编写一个附加组件,如下所示:然后像这样使用它:
tpgth1q73#
HTML中的[src]属性用于指定图像、视频、音频文件或包含在网页中的任何其他外部资源的源URL,它是HTML标准的一部分,而不是Angular 。
调整它的一种方法是使用数据绑定。