如何使用Javascript检查用户是否已登录

6
我有一个登录弹窗,需要在用户未登录时显示。这个弹窗完全由JavaScript和Fancybox实现,并使用Rails局部视图呈现HTML。
我可以看到Chrome中已经设置了cookie,但是`document.cookie`似乎返回为空。原因可能已经在这里解释了。
我该如何在JavaScript / erb中实现这一点?

4
有没有人实际上有一个基于JS的答案,不像下面列出的两个答案? - lulalala
可能是不可能的。请参见https://dev59.com/IInda4cB1Zd3GeqPFOKD#29739169或改用cookies。 - prograils
2个回答

3

在后端处理此事。如果您使用Rails进行操作,请务必使用并滥用current_user,因为它将是您最好的朋友。

然后在您的局部视图中,您可以自由地编写以下内容:

<% if current_user %>
     <p>Welcome <%= current_user.username %>!</p>
<% else %>
     <p>Please <%= link_to 'sign in', login_path %></p>
<% end %>

Rails会话,Ruby on Rails教程


谢谢,我想在表单提交时显示灯箱。这已经可以正常工作了。当用户登录时,我需要自动提交原始表单而不需要任何其他的用户操作。Ajax 登录调用确实会添加一个 cookie。如果使用您提到的方法,我将不得不刷新页面才能知道用户是否已登录以便能够提交原始表单。 - ShaggyInjun
当页面刷新时,表单数据会丢失,除非我采取复杂的方式将表单数据保存到浏览器内存中,并在页面加载时填充表单。如果我能够检查cookie,那么就会更容易。项目中启用了Rest。是否有一个设备会话控制器方法,我可以通过ajax调用来验证用户是否已登录? - ShaggyInjun
@ShaggyInjun 好的,我想我知道你在问什么。你是否在隐藏灯箱之前检查登录凭据是否正确?如果是这样,在您的程序响应(使用AJAX)“是的,这些凭据是正确的”时,您还可以发送所需的用户数据,然后使用javascript处理其余部分。也许像$('#welcome').text(data.username);这样的东西,如果您的灯箱是一个表单:remote => true,那么您可以在app/views/sessions下的create.js.erb中处理所有这些内容。这取决于您的应用程序结构。 - Jordan Scales
所以,我认为您的意思是将原始表单数据在 REST 调用之间来回传递,以便它可用?-> 显示 lightbox -> 获取原始表单数据并与登录请求一起传递 -> 在响应中返回原始表单数据 -> 刷新页面 -> 在原始表单中重新填充数据。问题是,如果我这样做,一旦我刷新页面,它将失去所有状态,包括我存储在 JavaScript 变量中的任何数据。 - ShaggyInjun
@ShaggyInjun 好的,一旦页面刷新,用户就已经登录了 - 所以我不认为有问题。你是在问如何让用户使用AJAX登录吗?我认为流程是这样的。弹出框弹出 -> 用户输入数据 -> AJAX调用服务器 -> 响应说“一切顺利,Jordan已经登录” -> JS获取响应并将用户名放置在页面的某个位置。所有这些都不需要重新加载。 - Jordan Scales
1
谢谢回复。我迷失了方向并忘记了返回对象实际上返回一个sessionId。只要我有这个,我就很满意。 - ShaggyInjun

2
与Jordan Scales所说的方法相同,但是要更简单一些...DRYing if @current_user.nil?(如果@current_user为nil,则DRYing)请参考

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