我们的Django应用程序具有以下会话管理要求。
要求1
通过将SESSION_EXPIRE_AT_BROWSER_CLOSE设置为True可以轻松实现此要求。
要求2
我看到了一些建议,可以使用SESSION_COOKIE_AGE来设置会话的有效期限。但是这种方法具有以下问题。
该会话始终在SESSION_COOKIE_AGE末尾过期,即使用户正在使用该应用程序也是如此。(这可以通过使用自定义中间件将每个请求的会话过期设置为SESSION_COOKIE_AGE来防止,或者通过将SESSION_SAVE_EVERY_REQUEST设置为true来保存每个请求的会话。但是由于使用了SESSION_COOKIE_AGE,下一个问题是不可避免的。)
由于cookie的工作方式,SESSION_EXPIRE_AT_BROWSER_CLOSE和SESSION_COOKIE_AGE是互斥的,即cookie在浏览器关闭时或在指定的到期时间到期。如果使用了SESSION_COOKIE_AGE并且用户在cookie过期之前关闭了浏览器,则cookie被保留,重新打开浏览器将允许用户(或其他任何人)进入系统而无需重新认证。
Django仅依靠存在的cookie来确定会话是否处于活动状态。它不检查与会话一起存储的会话到期日期。
以下方法可用于实现此要求并解决上述问题。
要求4
使用JavaScript来检测用户不活动,提供警告以及扩展会话的选项。如果用户希望扩展,请向服务器发送一个保持活动状态的脉冲以扩展会话。
要求5
使用JavaScript来检测用户活动(在长时间的业务操作期间),并向服务器发送保持活动状态的脉冲,以防止会话到期。
上面的实现方法似乎非常复杂,我想知道是否可能有一个更简单的方法(尤其是对于要求2)。
任何见解将不胜感激。
这是一个主意…在该SESSION_EXPIRE_AT_BROWSER_CLOSE
设置下,关闭浏览器上的会话。然后像这样在每个请求的会话中设置时间戳。
request.session['last_activity'] = datetime.now()
并添加中间件以检测会话是否已过期。这样的事情应该处理整个过程…
from datetime import datetime
from django.http import HttpResponseRedirect
class SessionExpiredMiddleware:
def process_request(request):
last_activity = request.session['last_activity']
now = datetime.now()
if (now - last_activity).minutes > 10:
# Do logout / expire session
# and then...
return HttpResponseRedirect("LOGIN_PAGE_URL")
if not request.is_ajax():
# don't set this for ajax requests or else your
# expired session checks will keep the session from
# expiring :)
request.session['last_activity'] = now
然后,你只需要创建一些url和视图即可将有关会话到期的相关数据返回给ajax调用。
当用户选择“更新”会话时,可以这么说,你要做的只是requeset.session['last_activity']
再次设置为当前时间
显然,这段代码只是一个开始……但它应该使你走上正确的道路
问题内容: 对于每个请求,您可以通过几种不同的方式来判断会话是否已经开始,例如: 要么: 但是,如果您启动会话然后将其关闭,它们都将失败。将返回前一个会话的ID,同时将对其进行定义。同样,如果您已经有一个活动会话,则此时调用将生成一个。有没有一种明智的方法来检查会话当前是否处于活动状态,而不必诉诸输出缓冲,关闭运算符()或其他类似hacky的方法? 编辑8/29/2011:向PHP 5.4添加了新
那么我应该做些什么来实现这个目标呢?如有任何帮助/线索,请提前感谢
问题内容: 是否有可能使MySQL中的行处于非活动状态?因此,该行不再用于查询结果吗?我的客户希望保留删除的成员在数据库中的存在,但是我不想编辑所有查询以检查该成员是否被删除。 还是有一种简单的方法将整个行数据移动到另一个“非活动”表中? 问题答案: 您可以重命名当前表,在其中创建“ deleted”列,然后创建一个与当前表同名的视图,并选择“ deleted = 0”。这样,您不必更改所有查询。
问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些
问题内容: 我的网站上使用CakePHP拥有身份验证系统。为此,它使用PHP会话。 我所拥有的是对函数的AJAX调用(在setInterval中每分钟运行一次),该函数检查用户是否仍在登录。如果返回false,则Javascript将获取当前URL并尝试将其重定向, turn将他们重定向到登录页面。从理论上讲,这是可行的,因为它会主动要求用户重新登录,而不是进行陈旧的会话,后者只会要求用户单击某些
使用更新计划 API http://paypal.github.io/PayPal-PHP-SDK/sample/doc/billing/UpdatePlan.html,我没有找到计划是否具有“非活动”状态,并且我必须使用哪个密钥?我做了: 但出现错误: 请求的状态更改无效。 1)有效期如何? 2) 如果在我的开发人员帐户中有一个页面,我可以查看我的所有计划,并在我的开发者帐户中使用它们? 谢谢!