2017-04-26 93 views
0

我有一个UI(角度),作为Spring引导应用程序托管, UI与REST API(Jersey)对话。 当整个应用程序或其中的一部分进行维护时:REST:处理网站维护

1)我不确定,如何向任何现在访问的人显示维护网页(它应该是角度还是弹簧引导,后端,以及如何?)。

2)对于已经在网站某个部分的用户,我如何通知他们他们需要刷新。

3)对于已经在网站某个部分的用户,如果他们没有刷新,并且以后在维护结束后,如果他们发送带有一些旧的无效数据的POST请求,我该如何检查?

注意:该网站没有任何用户验证。

作为第三点的示例: UI显示数据库中记录的列表,并且用户正在对其中一个记录进行更改,同时后端进入维护状态。现在,此用户提交更改后的数据,当后端再次可用时。但是这个数据现在是无效的。我怎么能识别,并可能通知用户。

回答

0

通过维护我猜你的意思是你的API使用的一些数据库是更新或备份或类似的。在这种情况下,如果API无法处理该命令,我会让它返回一个503 Service Unavailable响应代码,并让前端向用户显示一些格式良好的信息。

为了确定客户端是否发送旧数据,您可以使用ETagLast-Modified标题。 ETags基本上是当前资源状态的散列。如果状态改变,那么ETag哈希也是如此。试图更新资源状态的客户端将以前获取的ETag散列与资源的新状态一起发送给API,然后API可以检查是否存在由某个其他客户端应用于资源的中间变更,并因此返回对于客户端来说它不会对最新版本采取行动的错误。条件请求在RFC 7232中定义。

关于你的第二个问题,我不完全确定你要完成什么。关于使用AJAX,我会说一口气。他们到底需要刷新什么?维护期间是否有一些资源数据发生变化?如果不是,他们为什么还要关心刷新?如果表单输入数据应该被重置,那么API可能会响应一个205 Reset Content响应代码,尽管这表示API已经完成了请求并通知客户重置输入数据。如果由于主要原因API无法处理请求,我还会返回503 Service Unavailable错误,并让前端通过AJAX向各个客户端发布信息,如果这是您的要求。

+0

感谢您的相当详细的解释。 是的,通过更新我的意思是数据库我会改变和新的记录可能会被添加。关于第二个问题,如果某些记录被添加到数据库(或删除),如果当前用户正在他的屏幕上使用这些记录,那么现在它是无效的,并且如果他在更改后将更改的记录提交回API ,那么我需要确定它来自旧页面,可能忽略它。 – gaurav5430

+0

在这种情况下,我会生成一个当前状态的哈希值,并将其作为ETag头与响应一起发送,并且如果在维护过程中某些记录的状态发生更改(通过您应用的任何逻辑),尝试更新记录一个处理了无效数据的客户端应该会失败,因为前提条件没有得到满足(当前ETag值与用户尝试更新的值不同)。如果在维护期间没有更改状态并且用户更新“旧”状态,则更新将成功,因为旧数据等于更新前的状态,因此不会出现冲突。 –

0

1)由于API无法知道前端的任何信息,因此我们不应该将逻辑放在那里。而且,如果不通过API进行通信,Angular无法知道后端的任何信息。如果您将API或Spring Boot降为维护,会发生什么情况?角落不会知道,除非你让它处理这些服务不可用时收到的回应。

2)从Angular中,您可以对REST API的超时进行某种ping操作。然后在索引中有一个函数来检查API响应的状态。如果维护,重定向到维护页面。这会让你觉得它听起来像你想要的现场连接,虽然它会增加网络开销,并且让你的API变得更加困难。否则,如果您可以等到用户执行一个涉及您的API的操作,那么您可以处理服务关闭时返回的任何http错误代码。

3)你怎么知道它是旧的?这是一个安全问题吗?如果无法从通常传输的数据中分辨出来,可以添加某种时间戳,但这很容易规避。如果这是你想要的方式,那么时间戳上有很多话题。

+0

如果Angular app + Spring Boot正在维护中,谁负责显示维护页面,它应该是前端的新路线,还是应该是Spring Boot应用程序中的过滤器,它将所有请求路由到503? – gaurav5430

+0

IMO取决于哪些服务受到影响。如果会有一个只有Angular将无法访问的实例,Spring一方应该处理它。如果只有API /弹簧一侧将无法访问,Angular应该处理它。我无法想象Angular会在维护中进行维护的情况,因为它被编译为html和js,您只需在5秒钟的停机时间内将新文件放置到位。如果只有数据库将被维护,你可以把它放在Spring中,这将是最优雅的解决方案。 – Michael