如何在客户端管理当前用户会话
How do I manage the current user session on the client side?
我有一个web应用程序,部分是Rails和部分骨干。有些东西,比如我实现的注释系统,主要是在客户端用Javascript编写的。Rails后端只是通过来回传递JSON来处理持久性。
当我从服务器呈现页面时,处理谁可以看到什么很容易。我可以这样说
<li class="comment">
<span class="comment_text"><%= @comment.text %></span>
<% if user_signed_in? and current_user == @comment.author %>
<a class="delete" href="some delete url">Delete Comment</a>
<% end %>
</li>
并且只有当当前用户是评论的作者时,才会呈现删除特定评论的链接。没问题。
然而,现在我正在使用JavaScript模板(这是缓存)在客户端呈现评论,我没有访问current_user
。我不知道当前使用我的应用程序的用户是否是评论的作者,所以我无法控制他看到的内容。
当然,无论如何他都不能删除评论,因为我也在服务器上授权了,但我宁愿一开始就不给他看链接。
我怎样才能做到这一点?
我想要一些关于这个话题的资源链接以及答案,因为我似乎找不到任何链接,尽管在我看来这是一个应该在无数博客中讨论的话题。
我更喜欢使用以下方法:
首先,在服务器端生成的布局中,传递客户端需要的当前用户数据:
<script type="text/javascript">
window.currentUser = {
id : "<%=current_user.id%>"
}
</script>
在您的EJS模板中可以访问它。现在,在模板中,您可以进行与服务器端相同的检查:
<% if (window.currentUser && window.currnetUser.id == comment.author.id) { %>
<a class="delete" href="some delete url">Delete Comment</a>
<% } %>
这有时被称为客户端个性化。它涉及使用css类来隐藏和显示基于javascript从cookie或ajax请求中获得的值的特定元素。
我更喜欢在封装缓存层的机架中间件中设置cookie中的用户状态、名称和其他关键数据。这样,用户会话的逻辑就可以与缓存的数据隔离开来。然后我使用javascript读取这个cookie并根据需要更改页面。对于您给出的注释示例,我将在数据属性中为每个注释提供其ID的摘要(如果您不关心安全含义,也可以只提供ID),如下所示:
<div class="comment_203948">...</div>
并将用户评论的id存储在上述cookie中。然后javascript读取cookie并找到所有具有这些id的注释,并为它们显示'delete'链接。
这种方法的一个常见问题涉及到cookie溢出时会发生什么,就像这个例子中一个多产的评论者所发生的那样。另一种方法是使用ajax获取用户的相关JSON数据,然后将其缓存到本地存储中。我喜欢将其与在cookie中保存用户JSON数据的一个版本相结合,该版本可以在服务器端使用after_save回调和其他缓存过期策略进行更新。然后,Javascript简单地比较本地存储中用户JSON的状态与cookie中的版本,并在过时时通过ajax请求刷新该JSON。
有关客户端个性化的更多提示,请参阅"客户端缓存个性化"下的这篇文章:http://www.tumblr.com/tagged/caching
和这个:http://pivotallabs.com/users/nick/blog/articles/297-making-rails-wicked-fast-pagecaching-highly-personalized-web-pages
Ryan Bates描述了这种情况的一种常见做法,让我来解释一下。它有助于动态页面缓存,当你使用页面缓存,但需要从服务器端获取一些东西并处理它。
即将呈现没有"Delete"链接的页面,然后获得一个请求来检查是否用户会话,并将结果赋值给一个变量。
实现之一,稍微深入一点:
# controller
class UserSessionController < ActionController::Base
skip_before_filter :require_user, :only => [:new, :create, :user_sign_in]
def user_sign_in
if current_user
render :text => 'success'
else
render :text => 'false', :status => 403
end
end
end
class CommentsController < ApplicationController
def has_right
current_user == @comment.author
end
end
# view
<% javascript_tag do %>
var a = $.getJSON('/user_session/user_sign_in', function(data){
console.log(data)
});
<% end %>
然后处理结果并隐藏/显示注释div
- DreamFactory REST API POST休息/用户/会话请求总是在IE9中返回错误
- JavaScript 中的用户会话跟踪
- Zkoss:如何通知用户会话超时或与服务器的连接丢失
- 可以'在尝试使用chai请求代理为测试维护用户会话时,t在发送标头后设置标头出错
- 如何将用户会话保存在PHP中的一个变量中,以便在JavaScript中引用
- 使用 http 删除终止用户会话
- 仅在某些请求上保存用户会话
- 如何在用户会话的辅助页面中获取 GA utm 参数
- 将响应式文件管理器与创建用户会话配合使用
- 如何安全地存储和访问用户会话数据
- 无法在量角器测试中保持用户会话活动状态
- 从谷歌分析cookie获取当前用户/会话页面视图
- Angular应用程序检查用户会话是否已过期或持续注销
- 如何在Parse.com中将数据保存到用户会话
- 跟踪器用户会话与Cookie,而不是像谷歌JS
- 使用selenium网络驱动程序更新用户会话
- 使用Javascript的Android应用程序中的用户会话
- 提取序列化的用户会话数据
- 存储用户会话:node.js, express, mongoose-auth
- 在javascript中访问用户会话数据的麻烦