cookie是存储在浏览器端,session是服务器端

cookie是有时间限制的,分会话cookie和持久cookie,如果不设置时间,那周期就是创建到浏览器关闭为止.这种是会话cookie,一般保存在内存中

如果设置了过期时间,浏览器就会把cookie保存在硬盘中.

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

在go语言中的cookie结构体

  1. type Cookie struct {
  2. Name string
  3. Value string
  4. Path string
  5. Domain string
  6. Expires time.Time
  7. RawExpires string
  8.  
  9. // MaxAge=0 means no 'Max-Age' attribute specified.
  10. // MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
  11. // MaxAge>0 means Max-Age attribute present and given in seconds
  12. MaxAge int
  13. Secure bool
  14. HttpOnly bool
  15. Raw string
  16. Unparsed []string // Raw text of unparsed attribute-value pairs
  17. }

全局的session管理器

  1. type Manager struct {
  2. cookieName string // private cookiename
  3. lock sync.Mutex // protects session
  4. provider Provider
  5. maxLifeTime int64
  6. }
  7.  
  8. func NewManager(provideName, cookieName string, maxLifeTime int64) (*Manager, error) {
  9. provider, ok := provides[provideName]
  10. if !ok {
  11. return nil, fmt.Errorf("session: unknown provide %q (forgotten import?)", provideName)
  12. }
  13. return &Manager{provider: provider, cookieName: cookieName, maxLifeTime: maxLifeTime}, nil
  14. }
  1. package memory
  2.  
  3. import (
  4. "container/list"
  5. "github.com/astaxie/session"
  6. "sync"
  7. "time"
  8. )
  9. //内存存储的session机制
  10. var pder = &Provider{list: list.New()}
  11.  
  12. type SessionStore struct {
  13. sid string //session id唯一标示
  14. timeAccessed time.Time //最后访问时间
  15. value map[interface{}]interface{} //session里面存储的值
  16. }
  17.  
  18. func (st *SessionStore) Set(key, value interface{}) error {
  19. st.value[key] = value
  20. pder.SessionUpdate(st.sid)
  21. return nil
  22. }
  23.  
  24. func (st *SessionStore) Get(key interface{}) interface{} {
  25. pder.SessionUpdate(st.sid)
  26. if v, ok := st.value[key]; ok {
  27. return v
  28. } else {
  29. return nil
  30. }
  31. }
  32.  
  33. func (st *SessionStore) Delete(key interface{}) error {
  34. delete(st.value, key)
  35. pder.SessionUpdate(st.sid)
  36. return nil
  37. }
  38.  
  39. func (st *SessionStore) SessionID() string {
  40. return st.sid
  41. }
  42.  
  43. type Provider struct {
  44. lock sync.Mutex //用来锁
  45. sessions map[string]*list.Element //用来存储在内存
  46. list *list.List //用来做gc
  47. }
  48.  
  49. func (pder *Provider) SessionInit(sid string) (session.Session, error) {
  50. pder.lock.Lock()
  51. defer pder.lock.Unlock()
  52. v := make(map[interface{}]interface{}, 0)
  53. newsess := &SessionStore{sid: sid, timeAccessed: time.Now(), value: v}
  54. element := pder.list.PushBack(newsess)
  55. pder.sessions[sid] = element
  56. return newsess, nil
  57. }
  58.  
  59. func (pder *Provider) SessionRead(sid string) (session.Session, error) {
  60. if element, ok := pder.sessions[sid]; ok {
  61. return element.Value.(*SessionStore), nil
  62. } else {
  63. sess, err := pder.SessionInit(sid)
  64. return sess, err
  65. }
  66. return nil, nil
  67. }
  68.  
  69. func (pder *Provider) SessionDestroy(sid string) error {
  70. if element, ok := pder.sessions[sid]; ok {
  71. delete(pder.sessions, sid)
  72. pder.list.Remove(element)
  73. return nil
  74. }
  75. return nil
  76. }
  77.  
  78. func (pder *Provider) SessionGC(maxlifetime int64) {
  79. pder.lock.Lock()
  80. defer pder.lock.Unlock()
  81.  
  82. for {
  83. element := pder.list.Back()
  84. if element == nil {
  85. break
  86. }
  87. if (element.Value.(*SessionStore).timeAccessed.Unix() + maxlifetime) < time.Now().Unix() {
  88. pder.list.Remove(element)
  89. delete(pder.sessions, element.Value.(*SessionStore).sid)
  90. } else {
  91. break
  92. }
  93. }
  94. }
  95.  
  96. func (pder *Provider) SessionUpdate(sid string) error {
  97. pder.lock.Lock()
  98. defer pder.lock.Unlock()
  99. if element, ok := pder.sessions[sid]; ok {
  100. element.Value.(*SessionStore).timeAccessed = time.Now()
  101. pder.list.MoveToFront(element)
  102. return nil
  103. }
  104. return nil
  105. }
  106.  
  107. func init() { //自动运行init函数
  108. pder.sessions = make(map[string]*list.Element, 0)
  109. session.Register("memory", pder)
  110. }

  

go web cookie和session的更多相关文章

  1. web cookie and session

    一.什么是会话? 打开一个浏览器,访问多个网址后,再关掉浏览器,这一整个过程就是会话. 二.cookie技术 这是客户端保存临时数据的技术,主要用于保存用户的登录信息及其它需要保存的数据,如购买与结帐 ...

  2. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

  3. web框架开发-Django组件cookie与session

    http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...

  4. web存储中cookie、session区别

    http协议是一种无状态的协议,浏览器对服务器的每一次请求都是独立的.为了使得web能够产生一些动态信息,就需要保存”状态”,而cookie和session机制就是为了解决http协议无状态而产生.c ...

  5. Java Web 开发必须掌握的三个技术:Token、Cookie、Session

    在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie ...

  6. Java Web(三) 会话机制,Cookie和Session详解(转载)

    https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...

  7. Java开发工程师(Web方向) - 02.Servlet技术 - 第2章.Cookie与Session

    第2章--Cookie与Session Cookie与Session 浏览器输入地址--HTTP请求--Servlet--HTTP响应--浏览器接收 会话(session):打开浏览器,打开一系列页面 ...

  8. Java Web Application使Session永不失效(利用cookie隐藏登录)

    在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...

  9. Session or Cookie?是否需要用Tomcat等Web容器的Session

    Cookie是HTTP协议标准下的存储用户信息的工具,浏览器把用户信息存放到本地的文本文件中. Session是基于Cookie实现的. 2011年4月,武汉群硕面试的时候(实习生),面试官也问过这个 ...

随机推荐

  1. SQL获取本周,上周,本月,上月的开始时间和结束时间

    ),),--本周 ),),--上周 ),),--本月 ),),--上月 ),),--近半年 ),)--近一年 ), ,, ),)--本周开始时间 ), ,, ),)--本周结束时间 ),,, ),)- ...

  2. centos开启IPV6配置方法

    目前国内大部分服务器和PC不支持IPV6地址的,但是服务器上本身是可以正常开启IPV6服务,有部分程序在服务器上运行的时候,需要服务器能监听一个ipv6地址才行,因此本文档指导如何在centos服务器 ...

  3. python入门2 python字符串换行显示、字符串太长\连接多行

    #coding:utf-8 #/usr/bin/python """ 2018-11-03 dinghanhua 缩进 换行 """ &qu ...

  4. Android(java)学习笔记32:Android布局详解之一:FrameLayout

    1. FrameLayout是最简单的布局了.所有放在布局里的控件,都按照层次堆叠在屏幕的左上角.后加进来的控件覆盖前面的控件. 在FrameLayout布局里,定义任何空间的位置相关的属性都毫无意义 ...

  5. [SCOI2014]方伯伯运椰子

    嘟嘟嘟 01分数规划思维题. 题中要求交通总量不减少,那么如果总量增加的话,总费用就会增加,所以一定不是更优的解.那么总量守恒. 这是不是就想到了网络流?对于每一个节点流入量等于流出量.然后就是很有思 ...

  6. 卸载由源码编译安装的软件(如OpenCV)

    看安装软件的时候有没有使用--prefix这个参数,如果有那就把你指定的文件给删除了就行了. 如果没有用这个参数就麻烦一点了,那就进入到软件解压后的目录,执行sudo make uninstall看能 ...

  7. 【洛谷P3469】[POI2008]BLO-Blockade

    BLO-Blockade 题目链接 若一个点为割点:统计出每个子树的大小,两两相乘再相加, 再加上n-1,为这个点与其他点的拜访数, 因为拜访是互相的,最后再乘二即可 若一个点不是割点:只有(n-1) ...

  8. grunt_beginner

    前端集成解决方案:一套包含框架 和 工具,便于开发者快速构建美丽实用的web应用程序的工作流,同时 这套工作流必须是稳健强壮的. Yeman Bower web包管理器 框架.库.公共部分 Grunt ...

  9. papers-06-02

    午睡被同事吵醒,只好干活.看到微信公众号有一篇文章说老朋友呢,点进去发现原来相关的工作好多,而且好新好细致. 微信的文章可以见这里: 探究最陌生的老朋友Softmax 里面的几篇文章可以看看. Lar ...

  10. ProjectServer如何创建时间表

    默认配置的ProjectServer是没有时间表的,任务汇报的时候不能汇报工时,只能汇报任务的百分比. 但如果有企业一定要用工时来汇报的话,我们就需要开启时间表. 点击服务器设置-->时间报告阶 ...