Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在客户端单页应用程序中管理服务器用户会话_Javascript_Jquery_Jsp_Session_Single Page Application - Fatal编程技术网

Javascript 如何在客户端单页应用程序中管理服务器用户会话

Javascript 如何在客户端单页应用程序中管理服务器用户会话,javascript,jquery,jsp,session,single-page-application,Javascript,Jquery,Jsp,Session,Single Page Application,我一直在摸索不同的客户端技术,比如AngularJS、EmberJS,甚至尝试使用直截了当的JQuery并找出如何使用ReactJS。除此之外,我的目标是在客户端和JavaJersey 2JAX-rs后端api之间使用json构建一个单页应用程序 我现在有两个绊脚石。不过有些信息..我正在Jetty中以WAR文件的形式部署我的应用程序。我的后端是基于java的。到目前为止,我只在客户端使用jquery 我的主要障碍是如何处理登录、注销和会话管理。使用RESTAPI和ajax,我可以登录,包括设置

我一直在摸索不同的客户端技术,比如AngularJS、EmberJS,甚至尝试使用直截了当的JQuery并找出如何使用ReactJS。除此之外,我的目标是在客户端和JavaJersey 2JAX-rs后端api之间使用json构建一个单页应用程序

我现在有两个绊脚石。不过有些信息..我正在Jetty中以WAR文件的形式部署我的应用程序。我的后端是基于java的。到目前为止,我只在客户端使用jquery

我的主要障碍是如何处理登录、注销和会话管理。使用RESTAPI和ajax,我可以登录,包括设置cookie。然而,我担心的是单页应用程序,只有一个索引页,如果用户关闭浏览器,然后在cookie/会话仍然正常的情况下将其重新打开到索引页,则用户应该登录,而不是查看外部(未登录)页。我不确定如何处理这个问题,不管它是一个jsp页面、带有模板库的index.html,等等。使用jsp我可以插入一些scriplet代码(根据我更好的判断)。在过去,我会包含一个标头,用于检查request.getSession().getAttribute(“用户”)以及它是否存在。用户已登录并使用scriplet if()代码,我会显示一个已登录的标头,而不是未登录的标头。但我相信,在今天的客户端JS框架中,一定有更好的方法来实现这一点

另一个障碍是导航和动态方面。例如,当我在处理angular js时,使用Welcome{{name}}并在范围内为登录用户使用json响应值替换名称是非常容易的。在我目前的情况下,除了在ajax调用的响应成功方法中使用某种$(“#elem id”).innerHtml=“…”代码之外,我不确定如何最好地使用纯jquery来显示这样的动态位。此外,我不太确定如何处理不同页面的导航。我登录的站点将有一些下拉菜单或链接,这些菜单或链接将用不同数量的内容替换内容区域

首先,在重新加载页面或关闭/崩溃浏览器重新启动的情况下,SPA中有哪些处理用户会话的方法。。确保用户仍然登录并将其引导到正确的页面?第二,有什么样的模板和路由/导航选项不需要我在我的one index.jsp页面中放入大量代码


谢谢。

如果您使用REST API作为后端,那么您必须实现oAuth作为身份验证机制。也就是说,当您的用户使用用户名和密码登录时,您将使用身份验证令牌交换该数据。此身份验证令牌随每个API调用一起发送到服务器,并且您的后端在服务请求之前验证此令牌。到目前为止还清楚吗

您可以做的是,当您获取访问令牌时,还可以从服务器获取访问令牌过期时间,并将该数据存储在客户端应用程序中。可能在本地存储中?当您的用户关闭浏览器并再次打开时,您可以在要求用户登录之前先检查该访问令牌是否可用(且未过期)。这将解决您的第一个问题


其次,如果您正在寻找一个轻量级路由选项,我推荐。

我正在构建一个类似的应用程序。OAuth不是强制性的。如果用户希望持久登录,您可以通过点击jersey登录端点并设置会话和会话cookie“keepme”来进行正常会话等。然后,您可以让一个过滤器检查是否存在具有有效会话或活动会话的cookie,并保持用户登录


您的前端应用程序应该对此没有发言权,只需与服务器通信,如果它没有获得未经授权的访问(来自AuthFilter),则继续,否则它将显示登录页面。

您不认为这是一个很长的故事,谁可以自由阅读?尽量缩短您的问题,或者给我们一些您尝试过的代码。@Rohan。。不知道你是怎么回答我的问题的?我在这里看到了更多的问题。我觉得我提供了所需的细节。如果那太多了,就别读了。没有人强迫你这么做。我想我是在按照你说的去做。虽然就我而言。。至少现在使用jquery时,在加载文档时,我会对API进行GET检查,以查看用户是否登录。也许更好的选择是阅读document.cookie并查找特定于服务器的cookie,而不是加载ajax请求?加载ajax请求背后的想法是,如果存在cookie,请求将允许ajax处理程序使用cookie并验证用户/会话是否有效、是否超时等。好吧,因为您在每个请求上验证用户的身份验证令牌,为什么要检查用户是否显式登录?我实际上已经改变了我的方式。我有幸不需要支持IE9或更早版本,因此决定使用本地存储来存储会话令牌,如果页面被重新加载,我会在页面加载时检查会话令牌,如果找到,则将用户重定向到其登录的仪表板。如果用户选择注销,我将删除会话令牌。例如,如果他们几个小时后回来,在检查是否过期的过程中,它将被删除,他们将再次出现在主页上,然后可以再次登录。这是最好的方法。我也是这样做的。我还维护本地存储的过期时间。这样,如果它过期了,我不需要调用服务器将用户重定向到登录页面。这是一个很好的观点。。。我会加进去的。据我所知,localStorage是安全的,因为它只能由同一服务器上的javascript访问。但是有机会吗