Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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_Angularjs_Session - Fatal编程技术网

Javascript 如何确定用户是否仍然使用基于会话的身份验证登录?

Javascript 如何确定用户是否仍然使用基于会话的身份验证登录?,javascript,angularjs,session,Javascript,Angularjs,Session,我知道这已经被问了无数次了,但是我发现没有一个答案描述了到后端的实际连接 我有一个单页JS应用程序,可以与小型后端(Django)API进行通信。我使用基于会话的身份验证。用户信息在第一次加载时被缓存。若会话过期,我需要更改页面标题并刷新缓存中的用户信息。然而,我的大多数API资源都是公共的,并且总是返回200。其他几个资源是私有的,如果用户未登录,则返回403,这非常好,因为这为我提供了所需的信息。问题是,有些页面只访问公共资源。若会话在后端突然被删除,并且用户导航到只访问公共资源的url,那

我知道这已经被问了无数次了,但是我发现没有一个答案描述了到后端的实际连接

我有一个单页JS应用程序,可以与小型后端(Django)API进行通信。我使用基于会话的身份验证。用户信息在第一次加载时被缓存。若会话过期,我需要更改页面标题并刷新缓存中的用户信息。然而,我的大多数API资源都是公共的,并且总是返回200。其他几个资源是私有的,如果用户未登录,则返回403,这非常好,因为这为我提供了所需的信息。问题是,有些页面只访问公共资源。若会话在后端突然被删除,并且用户导航到只访问公共资源的url,那个么用户信息不会被刷新,我有一个用户体验问题

我最初的想法是在每次url更改时请求私有用户资源(我们称之为
/users/self/
),如果用户通过身份验证,则返回200,如果用户未通过身份验证,则返回403。然而,这需要在每个url更改的其他请求之前再请求一个额外的请求,这并不理想


在这种情况下,有没有更简单的方法可以使用?如果可以解决问题,我甚至不介意切换到其他类型的身份验证。

我所做的和看到的这些场景是使用某种类型的http拦截器拦截Angular完成的所有http请求,如果它发现响应状态为401,这些拦截器将使用
$rootScope
引发事件

这里有一个图书馆吗

要使用它,您需要使用某种类型的根控制器订阅事件,它可以将用户重定向到登录页面


查看此处的示例

如果会话未过期,只需在每个请求中检查后端,而不是发送额外的身份验证请求。如果用户未进行身份验证,则返回状态代码


在angularjs中,我们使用了一个httpResponse拦截器,它截取每个响应并检查此状态代码。

我们在工作时做了其他人已经告诉过你的事情:使用httpResponse拦截器

我们从后端发送的每个响应的结构都是相同的:一个包含两个字段的对象:一个responseCode和一个实际响应。我们根据后端发生的情况改变响应代码,最常见的情况是给定操作所需的成功、安全警报或身份验证


然后拦截器根据我们定义的每个响应代码以适当的方式作出反应。在需要身份验证的情况下,我们重定向到登录页面,您可以根据需要执行任何操作。这对我们来说非常有用。

如果用户仍然登录,无论请求的资源是否为公共资源,您的后端都可以在响应中添加标题。然后,客户机可以检查该报头的存在并相应地采取行动


在两侧,这是通过某种过滤器或拦截器完成的。在angular中,这将是一个。

问题是大多数响应是公开的,并且总是返回200。如果会话过期,他们返回403/401是没有意义的。@OndrejSlinták不要在需要会话的服务器上混合路由和开放的公共路由。这将为您以后创建更多的工作。您的意思是,公共响应依赖于某些受限资源,这意味着它们自己应该受到限制,或者以某种方式访问受限资源,从而导致访问时身份验证重定向。@MathewFoscarini我没有混合这些。假设您拥有用户配置文件(公共资源),当您还可以访问朋友(私人资源)时,它看起来略有不同。配置文件本身仍然是公共的,但它会根据您的身份验证状态进行更改。我无法这样做,因为某些URL只请求公共资源,而这些资源总是返回200。对于他们来说,返回任何其他内容都没有意义。但是如果您没有登录并请求资源,肯定会有不同的反应。我在考虑这个问题,但这会使响应缓存变得更困难。“但这只是我的特殊情况。”昂德雷杰斯林塔克,你能详细说明你的担忧吗?我看不出这会如何影响缓存。在我的例子中,我正在缓存完整的响应,包括标题。这样,在发送响应之前,我必须修改它们。但这仍然是我在考虑的事情。