【发布时间】:2021-09-21 15:23:56
【问题描述】:
在 Angular 中调用我的 REST 服务时,没有响应标头。
Angular 中的登录方法
login(username: string, password: string) {
const credentials = { "username": username, "password": password };
return this.http.post(this.url, credentials)
.subscribe(
data => console.log(data), // JSON.stringify(data.headers) also is empty
error => console.log(error)
);
}
Chrome 开发工具控制台中的输出
响应 {_body: "", status: 200, ok: true, statusText: "OK", headers: 标头...}标头:标头_标头:映射(0)_normalizedNames: Map(0)proto: Objectok: truestatus: 200statusText: "OK"type: 2url: "http://localhost:8080/backend/rest/login"_body: ""原型:正文
但是当我用 postman 发送相同的 post 请求时,我得到了预期的结果:
Access-Control-Allow-Credentials →true
Access-Control-Allow-Origin →chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
Authorization →Bearer eyJ[...]
Connection →keep-alive
Content-Length →0
Date →Mon, 12 Jun 2017 13:19:54 GMT
Server →WildFly/10
Vary →Origin
X-Powered-By →Undertow/1
REST 服务
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response authenticateUser(CredentialsDTO credentialsDTO) {
try {
authService.login(credentialsDTO.getUsername(), credentialsDTO.getPassword());
} catch (WrongCredentialsException e) {
return Response.status(Status.FORBIDDEN).entity("WrongCredentialsException").build();
}
// Issue token
String token = issueToken(credentialsDTO.getUsername());
// Return the token on the response
return Response.ok().header(AUTHORIZATION, "Bearer " + token).build();
}
为什么我在 chrome 中看不到标题?
更新 我还使用了一个允许 Javascript 首先联系我的后端的 CORSFilter。这就是它在我的 web.xml 中的配置方式
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.allowGenericHttpRequests</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowSubdomains</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, HEAD, POST, DELETE, OPTIONS</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.maxAge</param-name>
<param-value>3600</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- CORS Filter mapping -->
<filter-name>CORS</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
虽然我认为它被配置为允许一切,但我不确定这是否与我的问题有关。
【问题讨论】:
-
data 是一个响应对象,你应该执行 console.log(data.headers) 来查看它们,或者如果你看不到它们,可以在日志中 JSON.stringify 它们。
-
@SrAxi 没有。 @Tim 你的服务器没有发送
Access-Control-Expose-Headers设置为Authorization所以它对 js 不可用。 -
@SrAxi 如果被禁止,则根本不会有任何响应。
-
@n00dl3 你不会得到“拒绝访问”响应吗?不过,你是对的。
-
@Tim:
<init-param><param-name>cors.exposedHeaders</param-name><param-value>Authorization</param-value><init-param>