我已经在 php 中创建了一个带有注销功能等的登录系统。但是我需要在窗口关闭时销毁 session 。这需要“即时”或尽快将用户状态更改为离线。我真的不想在 session 上设置时间,因为这对于必须一直登录的用户来说很烦人。
欢迎任何建议,谢谢。 =)
最佳答案
默认情况下,当浏览器关闭时,PHP 发送的所有 session cookie 都会被删除。但据我所知,您想在其他浏览器上显示通知。这有点难而且不太好。你必须使用 window.onclose事件处理程序并向服务器发出 Ajax 请求(我相信它应该是同步请求)以指示窗口关闭。同步调用不是很好......
另一方面,其他浏览器将不得不通过其他 Ajax 请求拉取服务器,以查看特定用户何时注销。
所有这些 Ajax 请求都构成了一个丑陋的解决方案。
更新:
正如 Thorarin 和 Jonathan Fingland 所说,多个窗口可能存在问题(不是选项卡,因为 window.onclose 在窗口而非选项卡上触发),但我相信也有解决此问题的方法。如果第一个窗口设置一个 cookie number_of_windows = 1,每个打开的窗口都会递增,然后在窗口关闭时,只有当 number_of_windows 等于 1 时才会触发 Ajax 请求,否则它只会递减 number_of_windows。
更新 2:
上述解决方案确实会遇到多个打开的选项卡的问题。我在考虑如何减轻这种情况。
更新 3:
好的,我找到了某种解决方案,但它在 IE6 中不起作用,不知道其他 IE 版本。下面的代码片段跟踪打开的窗口和选项卡的数量(IE 除外,它不会在窗口之间实时更新 document.cookie,但我相信它可以通过一些 IE 专有功能来解决)。然后在每个页面卸载时,这意味着即使在同一网站上从一个页面导航到另一个页面,脚本也会检查有多少打开的窗口。如果它是唯一打开的窗口/选项卡,那么它会发出 Ajax 请求。这是解决方案的第一部分。现在,第二部分。
在服务器端,Ajax 调用请求的脚本应该更新数据库中的一些条目,表明用户可能 已关闭页面。您如何确定她是否不仅仅是在访问您网站上的新页面?很简单,在每次访问页面时,您都会检查数据库中该 session 的“可能已注销”值,如果存在,则将其标记为假(用户已登录),否则用户会一直在数据库中注销(真标志)。
它很困惑,但它是我想到的唯一解决方案,因为我无法确定页面重新加载或 JavaScript 中的类似操作。另外,我没有做广泛的测试,更多的是一个想法。无论如何,我不会推荐这个解决方案。对每个已更改页面的 Ajax 请求都太过分了,并且在不计算其他浏览器完成的轮询的情况下,实际上会使服务器上的点击次数加倍。
这是片段。顺便说一下,bakery.js 是 document.cookie 的一个小包装器。你可能会发现 its source here on github .
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" src="bakery.js"></script>
<script type="text/javascript">
var logout = function() {
var xhr = new XMLHttpRequest;
xhr.open("GET", "logout.php", false);
xhr.send(null);
};
window.onload = function() {
var winNumber = parseInt(IGS.Bakery.getCookie("winNumber"), 10) || 0;
IGS.Bakery.setCookie("winNumber", winNumber + 1);
};
window.onunload = function() {
var winNumber = parseInt(IGS.Bakery.getCookie("winNumber"), 10) || 0;
IGS.Bakery.setCookie("winNumber", winNumber - 1);
if (winNumber === 1) {
logout();
}
};
var showCookies = function() {
alert(IGS.Bakery.getCookie("winNumber"));
};
</script>
</head>
<body>
<a href="#" onclick="showCookies();">show</a>
</body>
</html>
忘记说了。 window.onclose 不是跨浏览器的。
关于php - 在窗口关闭时销毁 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/959655/
下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11
使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于
我想用这两种语言中的任何一种(最好是ruby)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生
一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我正在尝试使用Sinatra中的重定向和session在网站周围传递一些数据。这是一个简化的示例,使用PrettyPrint进行调试:require'pp'require'rubygems'require'sinatra'enable:sessionsget'/'dosession[:foo]='12345'puts'session1'ppsessionredirectto('/redir')endget'/redir'doputs'session2'ppsession'helloworld'end查看Thin的输出,我看到:>>Listeningon0.0.0.0:4567,CTRL
使用ruby的watir测试网络应用程序时,浏览器最后会保持打开状态。网上的一些建议是,要进行真正的单元测试,您应该在每次测试时(在拆卸调用中)打开和关闭浏览器,但这很慢而且毫无意义。或者他们做这样的事情:defself.suites=superdefs.afterClass#Closebrowserenddefs.run(*args)superafterClassendsend但这会导致摘要输出不再显示(诸如“100次测试、100次断言、0次失败、0次错误”之类的内容仍应显示)。我怎样才能让ruby或watir在我的测试结束时关闭浏览器? 最佳答案
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
我想设置秒数aflash在自动关闭之前向用户显示通知。 最佳答案 您可以在页面上使用一些简单的JavaScript(在此示例中使用jQuery):$('document').ready(function(){setTimeout(function(){$('#flash').slideUp();},3000);});假设保存您的flash消息的HTML元素的id是#flash,这将向上滑动并在3000毫秒(3秒)后将其隐藏。 关于ruby-on-rails-如何在一段时间后关闭Rails