【问题标题】:Losing session at every REST call在每次 REST 调用中丢失会话
【发布时间】: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


【解决方案1】:

目前,两个 URL 都有自己的单独会话。您本质上需要的是“后端到后端”通信。您可以通过使用 dev-server 代理来实现。

开发服务器代理是一种软件,位于执行 Ajax 请求的 JavaScript/Angular 应用和后端 API 之间。

所以,假设不是这样做 -

this.http.get('http://you-server-hostame:8080/mybackend/...')
.map(res => res.json());

使用

this.http.get('/mybackend/')
.map(res => res.json());

在 Angular CLI 项目的根目录下创建一个 proxy.conf.json 文件。

{
 "/mybackend/*": {
"target": "http://8080:<your service port>",
"secure": false,
"logLevel": "debug",
"changeOrigin": true
 }
}

从我们的应用程序中向 /mybackend/... 发出的所有请求都将转发到 http://8080:/....

现在也用于启动您需要使用的服务器

ng serve --proxy-config proxy.config.json

注意:changeOrigin 属性。当您在后端使用一些虚拟代理(例如使用 Apache2 配置)时,您必须将其设置为 true。

它的作用是简单地在前端应用程序运行的同一个域+端口接收浏览器请求,然后将该请求转发到后端 API 服务器。

免责声明:不推荐用于生产

【讨论】:

  • 你为什么不推荐这个用于生产?
  • in prod..当从浏览器完成请求时,它使用“origin”标头,“告诉”服务器此请求来自何处。如果 Angular 托管在 APIs 服务器上,则源头将设置为相同的主机(因此不会出现跨源问题)。仅当您在节点 @ 4200 上运行 Angular 时才会出现问题
猜你喜欢
  • 1970-01-01
  • 2014-04-18
  • 2014-03-21
  • 2013-10-21
  • 2014-10-15
  • 2018-04-15
  • 2017-09-20
  • 2011-08-12
  • 2013-06-28
相关资源
最近更新 更多