【发布时间】:2018-11-12 03:28:25
【问题描述】:
我在 http://localhost:4200/myfrontend 上有一个 Angular 应用程序,它从 http://localhost:8080/mybackend 上的 Java REST api 获取数据。不过,在 Angular 应用程序中,每次我访问 REST api 时都会创建一个新会话。
我创建了一个测试,将前端和后端都放在http://localhost:8080 上,并且会话没有丢失。
我为 Java REST 后端设置的设置是:
response.getHeaders().add("Access-Control-Allow-Origin", "*");
response.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
response.getHeaders().add("Access-Control-Allow-Credentials", "true");
response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
我为 Angular 6.0.5 前端设置的设置是:
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
};
当前端和后端 URL 都不同时,我必须怎么做才能使会话保持活动状态?这是缺少 CORS 设置吗?
【问题讨论】:
-
会话作为 cookie 进行管理。如果域相同,则 Cookie 会从浏览器转发到服务器端,而当域不同时,每次都会创建会话 cookie
-
REST API 是无状态的。所以使用会话是容易出错的方法。
-
@Socrates 我更喜欢官方文档,只有当我在那里找不到答案时,我才会去stackoverflow。所以 doc 在这里restapitutorial.com/lessons/whatisrest.html# 它说:在 REST 中,客户端必须包含服务器完成请求的所有信息,如果该状态必须跨越多个请求,则根据需要重新发送状态。无状态可实现更大的可扩展性,因为服务器不必维护、更新或传达该会话状态。此外,负载均衡器不必担心无状态系统的会话亲和性。
-
@Socrates 请仔细阅读关于 REST 服务的 wiki en.wikipedia.org/wiki/Representational_state_transfer。注意“架构约束”部分和“无状态”小节。根据它 REST 服务没有会话,所有需要的数据都会在每个请求中发送到服务器。如果服务器上有会话,则不是 REST。
-
@Socrates 并且除了 url 和 body 之外还有其他地方可以发送数据,例如 headers,所以你可以使用所有 HTTP 方法,而不仅仅是 POST。
标签: java angular rest http-headers