存在 appcache 时使用 AJAX 和 Rails 设置会话变量
Posted
技术标签:
【中文标题】存在 appcache 时使用 AJAX 和 Rails 设置会话变量【英文标题】:Setting Session Variables with AJAX and Rails when appcache is present 【发布时间】:2011-10-20 08:57:09 【问题描述】:对“updateUser”进行 ajax 调用:
puts session[:user_id]
user = User.find(params[:user_id])
if user
session[:user_id] = user.id
session[:user_name] = user.first_name + " " + user.last_name
puts session[:user_id]
render text => "Success.
end
第一个puts
显示original user_id,第二个显示new user_id,因此它看起来工作正常。但是,当我导航到另一个页面时,所有会话信息仍然是 original user_id 的信息。我做错了什么?
我感觉这与本地会话 cookie 未更新有关。
更新
肯定与缓存有关。我可以转到该页面,清除浏览器缓存(我使用 Chrome 作为我的浏览器),然后运行 ajax 调用,它可以正常工作一次。之后,我再次被(新)旧用户锁定。
更新 2
看起来这与 html5 应用程序缓存有关。如果我杀死 appcache 或从不包含 manifest
的页面运行脚本,它就可以正常工作。仍然无法在缓存页面上正常工作。
从缓存页面向服务器发送的会话 ID 与非缓存页面相同,并且响应标头相同。但是来自本地缓存页面的每个请求都会导致服务器以旧会话信息启动。
【问题讨论】:
【参考方案1】:http://diveintohtml5.ep.io/offline.html
我可以告诉您,您遇到了清单缓存问题,并且更改会话本身不会清除清单。缓存是持久的,直到缓存项被取消缓存或清单失效。
另一个用户以不同的方式遇到了同样的问题:他们在 URI 中传递了他们的会话数据,并最终在用户每次访问时缓存了一个新应用程序。他们的解决方案可能有用:
How to clear Application cache (HTML5 feature) using javascript?
您还可以在各种存储缓存上查看此内容: http://sharonminsuk.com/blog/2011/03/21/clearing-cache-has-no-effect-on-html5-localstorage-or-sessionstorage/
最后,关于使用 JS 更新缓存文件的资源: http://www.html5rocks.com/en/tutorials/appcache/beginner/ 在检查会话 ID 是否已更改后,我将使用最后一个:更新会话 ID,然后确认更改,然后清除并重新下载缓存的文件。
祝你好运。希望对大家有所帮助。
【讨论】:
【参考方案2】:问题是会话信息被塞进应用程序缓存的某个地方,所有发送到服务器的请求都使用该会话信息(在页面加载时缓存)发送。因此,我们需要在成功调用 ajax 后使用window.applicationCache.update()
更新应用程序缓存。这将导致发送到服务器的下一个请求具有更新的会话信息,并且一切正常。
$.ajax(url: "/contoller/update_logged_user",
data: id: user_id,
success:function()
window.applicationCache.update();
)
【讨论】:
InvalidStateError: 试图使用一个不可用或不再可用的对象 window.applicationCache.update();【参考方案3】:我遇到了一个非常相似的问题...当提供 ajaxSubmit'ed 表单时,有一些代码可以将用户的邮政编码存储在 session[:zip] 中。只稍微修改了实现,突然 session[:zip] 失忆了。将信息存储在 cookies[:zip] 中工作正常。阻力最小的路径。
【讨论】:
【参考方案4】:在将 session[:user_id] = nil 分配给另一个值 user.id 之前,您是否尝试设置它,看看会发生什么?
【讨论】:
这样做了,没用。我还尝试创建一个新哈希,将所有会话数据转储到该新哈希中,运行reset_session
,对新哈希进行更改,然后将所有内容转储回新会话。没用。
如果你执行 session.delete :user_id,然后再次设置 session[:user_id] 会怎样。但是当您将 session[:user_id] 设置为 nil 时,它应该可以工作。我怀疑,您也在其他地方设置会话变量,这可能导致它设置为其他值。你能用 :user_id 搜索所有的地方吗?
它没有在其他任何地方设置,我可以保证。就像我说的,reset_session 没有正确杀死它,所以这不是问题。
您可以尝试在操作中使用 respond_to 块并使用 updateUser.js.erb 进行响应。您可以将该文件留空,或渲染一个 来说明某些内容。对于 Rails,建议使用约定 update_user 而不是 updateUser,只是说:)
以上是关于存在 appcache 时使用 AJAX 和 Rails 设置会话变量的主要内容,如果未能解决你的问题,请参考以下文章
使用 appcache 在服务器上重新部署后 Meteor 不断重新加载