为什么Session在控制器的构造函数中为null?它可以从Action方法访问.据推测,因为MVC路由框架负责新建一个Controller,所以它当时没有(重新)实例化Session.
有谁知道这是否是设计的,如果是的话,为什么?
[我已设法通过使用延迟加载模式来解决问题.]
我们的Django应用程序具有以下会话管理要求.
在阅读了文档,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来确定会话是否处于活动状态.它不会检查与会话一起存储的会话到期日期.
可以使用以下方法来实现此要求并解决上述问题.
要求3
当我们检测到会话已过期时(在上面的自定义SessionMiddleware中),在请求上设置一个属性以指示会话到期.此属性可用于向用户显示适当的消息.
要求4
使用JavaScript检测用户不活动,提供警告以及扩展会话的选项.如果用户希望扩展,则向服务器发送保持活动脉冲以扩展会话.
要求5
使用JavaScript检测用户活动(在长期业务操作期间)并向服务器发送保持活动脉冲以防止会话过期.
上面的实现方法似乎很精细,我想知道是否有一个更简单的方法(特别是对于要求2).
任何见解都将受到高度赞赏.
我目前正在使用MySql来存储我的会话.它工作得很好,但有点慢.
我被要求使用Redis,但我想知道这是不是一个好主意,因为我听说Redis延迟了写操作.我有点害怕,因为会议需要是实时的.
有谁遇到过这样的问题?
从php.net文档:
session_destroy - 销毁注册到会话的所有数据
session_unset - 释放所有会话变量
我的三个部分问题是:
这两个功能看起来非常相似.
这两者之间究竟有什么区别?
两者似乎都删除了注册到会话的所有变量.它们中的任何一个实际上都会破坏会话本身吗 如果没有,你如何做到这一点(破坏会话本身).
这两个函数都没有删除客户端的会话cookie,这是正确的吗?
任何人都有任何关于Rails和会话的"最佳实践"技巧?Rails 3的默认会话类型仍然是CookieStore,对吧?我使用SqlSessionStore已经有一段时间了,它运行良好,但我可能会偏离它,转而支持CookieStore.
将CookieStore用于敏感信息仍然不是一个好主意,即使是盐渍信息,还是更好地存储在数据库中?
我可以在一个内部使用会话值WebMethod吗?
我尝试过使用System.Web.Services.WebMethod(EnableSession = true)但是我无法访问Session参数,如下例所示:
[System.Web.Services.WebMethod(EnableSession = true)]
[System.Web.Script.Services.ScriptMethod()]
public static String checaItem(String id)
{
return "zeta";
}
Run Code Online (Sandbox Code Playgroud)
这是调用web方法的JS:
$.ajax({
type: "POST",
url: 'Catalogo.aspx/checaItem',
data: "{ id : 'teste' }",
contentType: 'application/json; charset=utf-8',
success: function (data) {
alert(data);
}
});
Run Code Online (Sandbox Code Playgroud) 我觉得这必须埋在文档中的某处,但我找不到它.
你如何在ExpressJS中关闭或结束或杀死(无论如何)会话?
如何与Socket.io 1.0和Express 4.x共享会话?我使用Redis商店,但我认为这无关紧要.我知道我必须使用中间件来查看cookie和获取会话,但不知道如何.我搜索但找不到任何工作
var RedisStore = connectRedis(expressSession);
var session = expressSession({
store: new RedisStore({
client: redisClient
}),
secret: mysecret,
saveUninitialized: true,
resave: true
});
app.use(session);
io.use(function(socket, next) {
var handshake = socket.handshake;
if (handshake.headers.cookie) {
var str = handshake.headers.cookie;
next();
} else {
next(new Error('Missing Cookies'));
}
});
Run Code Online (Sandbox Code Playgroud) 我正在研究时间和工作时间,但我找不到任何明确,有效的方法来制作它:/
我有一个英文的codeigniter基础网站,我现在必须添加波兰语.根据访客选择,以2种语言制作我的网站的最佳方法是什么?
有没有办法为每种语言创建数组文件,并在视图文件中调用它们取决于来自lang选择的会话?我不想使用数据库.
感谢帮助!我已经没过截止日期了:/谢谢!!
我正在尝试为我网站上的表单添加一些安全性.其中一种形式使用AJAX,另一种形式是直接的"联系我们"形式.我正在尝试添加CSRF令牌.我遇到的问题是令牌只在某些时候出现在HTML"值"中.剩下的时间,值是空的.这是我在AJAX表单上使用的代码:
PHP:
if (!isset($_SESSION)) {
session_start();
$_SESSION['formStarted'] = true;
}
if (!isset($_SESSION['token']))
{$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
}
Run Code Online (Sandbox Code Playgroud)
HTML
<form>
//...
<input type="hidden" name="token" value="<?php echo $token; ?>" />
//...
</form>
Run Code Online (Sandbox Code Playgroud)
有什么建议?