使用的 Gin框架,在使用session的时候遇到了一些小坑,分享一下,同时也希望有大佬能解答一下。
设置session的时候,set 之后,session并没有生效,必须要接着 save 才能生效,代码如下:
session := sessions.Default(c)
session.Set("mysession", "username")
session.Save()
网上有解释说:
Session的save()方法完成以下的操作:
(1)把Customer对象加入到缓存中,使它变为持久化对象。
(2)选用映射文件指定的标识符生成器为持久化对象分配惟一的OID。Customer.hbm.xml文件中元素的子元素指定标识符生成器
(3)计划执行一个insert语句,把Customer对象当前的属性值组装到insert语句中
值得注意的是,save()方法并不立即执行SQL insert语句。只有当Session清理缓存时,才会执行SQL insert语句。如果在save()方法之后,又修改了持久化对象的属性,这会使得Session在清理缓存时,额外执行SQL update语句。以下两段代码尽管都能完成相同的功能,但是左边代码仅执行一条SQL insert语句,而右边代码执行一条SQL insert和一条SQL update语句。左边代码减少了操作数据库的次数,具有更好的运行性能。
这一段不是很懂,因为我使用的是redis存储session。
以我的理解来看,第3步其实是可变的,根据你选用的存储方式,执行存储动作?前面的set方法,其实只是加入到了缓存中,只有使用save了,才会真正的存储下来。 我这样理解对吗?
然后在 logout 的删除缓存的时候,delete方法任然不生效,使用浏览器的后退任然能跳转,只有在加上save方法后,才生效,代码如下:
session := sessions.Default(c)
session.Delete(SessionContextName)
session.Save()
我看了redis,这个session的key-value还是存在的,同样并没有被删除掉,那为什么save之后,我再使用后退就会走到session校验不通过?
有没有大神可以帮忙解答一下,感谢万分!