使用Angular 5(REST Web服务)生成服务器端会话

3
我正在使用Angular-5Spring框架。在Spring框架中,我们使用RESTEG制作Web服务,在Angular中,我从Angular-5服务中调用Web服务。
现在的问题是,Angular在4200上运行,而Tomcat在8080端口上运行。因此,当我通过Web服务调用它时,Spring中的服务器端会话未生成。 Web服务正常工作,我能够调用Web服务并从Web服务中获得响应。但我无法生成在后端生成的会话。 我也尝试了代理服务器,Angular-5的代理服务器也很好用。对于代理设置,我使用了这个问题,并且它很好用:angular-cli server - how to proxy API requests to another server? 我能够从中获取请求和响应,但在创建代理之后,我遇到了同样的问题,即会话未被创建。
注意: 当我从Angular-5(ng build)构建并将其放入Tomcat中时,会话正常工作,但在开发Web服务时,我无法生成会话。
例如:我有一个Web服务, Url1:http://localhost:8080/MacromWeb/ws/login
我正在从端口4200上的Angular js调用Web服务。
Url2:http://localhost:4200/#/login,带有参数电子邮件和密码。
因此,当我从Angular调用Web服务时,它可以正常工作,并且也能给我响应,但是在服务器端创建的会话未生成。
1个回答

3
在这种架构中没有共享会话(这与Angular本身无关)。任何具有客户端和服务器端的应用程序都会发生这种情况(浏览器没有访问服务器会话的权限,其中运行JavaScript)。当您编写一些使用服务器端渲染模板的应用程序时,例如PHP、Rails、Java with Velocity或其他模板引擎等,情况就不同了。通常使用Web令牌来处理客户端和服务器端之间的安全性。您可以查看基于Angular的完整示例

谢谢你的回答。基本上,我们无法从前端创建服务器端会话吗?因为它可以在Postman中工作,并且在创建Angular构建之后也可以工作。 - Bhavin
1
服务器可以创建会话,但浏览器无法访问它。通常的模式是(1)客户端在第一个请求中发送一些数据来标识它/用户,(2)服务器进行验证并响应一个令牌(可以有过期日期、超时等...),(3)客户端获取此令牌,将其持久化,然后(4)在每个请求的标头中发送它,并且(5)服务器实现一个过滤器,在需要的任何地方验证此令牌。 - Christian Benseler
1
好的,明白了。谢谢你这么快速和完美的回复。 - Bhavin
1
当然,您可以将会话 ID 发送给客户端,然后客户端将其发送回来。但是这样存在一些问题。您可以在此处阅读更多相关信息(https://stormpath.com/blog/secure-single-page-app-problem),我建议您在 Google 中搜索“SPA 会话”。 - Christian Benseler
1
顺便说一下,您可以将后端应用程序视为其他应用程序可以使用的API。想想Google Maps API(或其他您曾经使用过的API):有许多客户端在使用它。客户端和API之间没有共享会话。相反,您必须在每个请求中发送在仪表板中创建新应用程序时提供的访问令牌。这是因为同样的原因:必须有一个标识请求者的密钥。 - Christian Benseler
哦,好的,我明白了。 所以,根据您的评论,当我们需要处理单页应用程序和REST Web服务时,JWT是最佳选择。 - Bhavin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接