session的工作原理、django的超时时间设置及session过期判断

session的工作原理、django的超时时间设置及session过期判断

1、session原理

cookie是保存在用户浏览器端的键值对

session是保存在服务器端的键值对

session服务端中存在的数据为:

session = {   随机字符串1:{   用户1的相关信息}   随机字符串2:{   用户2的相关信息}}

session客户端即客户端的浏览器的cookie中存的数据是当前用户对应的随机字符串

2、session详细解析(是否过期、失效时间)

  Session一直是我们做web项目经常使用的,以前没太注意,这次又细致的看了下!

  1.session其实就是一个Map,键=值对,通过session.getAttribute("name");获得session中设置的参数

  2.session的过期时间是从什么时候开始计算的?是从一登录就开始计算还是说从停止活动开始计算?

  答:从session不活动的时候开始计算,如果session一直活动,session就总不会过期。

   从该Session未被访问,开始计时; 一旦Session被访问,计时清0;

3、session的工作过程

1、 生成随机字符串

2、 写到用户浏览器的cookie中

3、 保存到session中

4、 在随机字符串对应的字典中设置相关内容

而上述过程在Django中的体现为:

request.session["username"]=user

这里的username为通过request.POST.get("username")从前端html页面中获取到的用户名信息

注意:

在Django中要用session中一定要先执行:

python manage.py makemigrations

python manage.py migrate

当用户登录的时候的就会在数据库的django_session表中记录session信息

同样的通过request.session["username"]也可以获取相应的值

在这个过程中:

1、 首先获取当前用户的随机字符串

2、 根据随机字符串获取对应的内容

4、session的操作

request.session["k1"] 如果不存在则会报错

request.session.get["k1"],如果不存在则会报错,为了防止出错可以request.session.get(‘k1‘,none)

request.session[‘k1‘] = 123 设置session值

request.session.setdefault(‘k1‘,123) 存在则不设置

del request.session[‘k1‘] 删除

request.session.clear() 删除

所有 键、值、键值对

request.session.keys()

request.session.values()

request.session.items()

request.session.iterkeys()

request.session.itervalues()

request.session.iteritems()

用户session的随机字符串

request.session.session_key

将所有Session失效日期小于当前日期的数据删除

request.session.clear_expired()

检查 用户session的随机字符串 在数据库中是否

request.session.exists("session_key")

删除当前用户的所有Session数据

request.session.delete("session_key")

5、session 的超时时间设置

5.1、django中 settings中的设置

SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)

SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)

SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)

SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)

SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)

SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)

SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

Session使用比较简单,在request.session是一个字典类。session是保存在数据库中的。

5.2、在views中的设置

request.session.set_expiry(value)

默认的过期时间是两周,如果自己设置了过期时间,这样自己设定的优先级就会高于默认的

如果value是个整数,session会在些秒数后失效。

如果value是个datatime或timedelta,session就会在这个时间后失效。

如果value是0,用户关闭浏览器session就会失效。

如果value是None,session会依赖全局session失效策略。

注意:

Django中设置session过期时间:
request.session.set_expiry(timedelta(days=30))
运行提示错误:TypeError: datetime.datetime(2018, 7, 3, 7, 36, 57, 636224, tzinfo=<UTC>) is not JSON serializable

解决办法:
在setting中添加:
SESSION_SERIALIZER=‘django.contrib.sessions.serializers.PickleSerializer‘

6、Django中对于session的存储方式

Django中支持session,其中内部提供了5种类型的session供开发者使用:

数据库(默认)

缓存

文件

缓存+数据库

加密cookie

1、如果是数据库,需要在settings.py中配置如下:

SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ (引擎(默认))

2、如果是缓存session,需要在settings.py中配置如下:

SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘(引擎)

SESSION_CACHE_ALIAS= ‘default‘ 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

1、 如果是文件session, 需要在settings.py中配置如下:

SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ (引擎)

SESSION_FILE_PATH=None 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()

2、 如果是缓存+数据库session,需要在settings.py中配置如下:

SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db‘ (引擎)

7、session的过期判断;

1) 以前是根据 if(session.getAttribute(‘user‘)==null)判断是否为空

  =========================================================================================

2) 如下为看到的一个帖子,判断session不为空的好方法:

   request.getSeesion(boolean)方法,一下子让我恍然大悟。这个方法里面传了一个boolean值,这个值如果是true,那么如 果当前的request的session不可用,那么就创建新的会话,如果存在就返回当前的会话。如果参数是false,那么在request的当前会话不存在的时候就返回null。
这样我们就可以很容易的联想到这个所谓的request的当前会话是否存在和session过期的联系,所以我们就可以“近似地”认为session不存在就是session过期了,那么我们就可以很容易地判断session是否过期了。方法如下:

if(request.getSession(false)==null){

  System.out.println("Session has been invalidated!");

  }

  else{

  System.out.println("Session is active!");

  }

  可能大家注意到我上面有一个“近似地”字眼,也就是说存在特别情况。 这个特殊情况就是第一次请求还没有创建会话的时候,那么用这个方法返回的仍然是null

推荐阅读