go web cookie和session
cookie是存储在浏览器端,session是服务器端
cookie是有时间限制的,分会话cookie和持久cookie,如果不设置时间,那周期就是创建到浏览器关闭为止.这种是会话cookie,一般保存在内存中
如果设置了过期时间,浏览器就会把cookie保存在硬盘中.
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
在go语言中的cookie结构体
- type Cookie struct {
- Name string
- Value string
- Path string
- Domain string
- Expires time.Time
- RawExpires string
- // MaxAge=0 means no 'Max-Age' attribute specified.
- // MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
- // MaxAge>0 means Max-Age attribute present and given in seconds
- MaxAge int
- Secure bool
- HttpOnly bool
- Raw string
- Unparsed []string // Raw text of unparsed attribute-value pairs
- }
全局的session管理器
- type Manager struct {
- cookieName string // private cookiename
- lock sync.Mutex // protects session
- provider Provider
- maxLifeTime int64
- }
- func NewManager(provideName, cookieName string, maxLifeTime int64) (*Manager, error) {
- provider, ok := provides[provideName]
- if !ok {
- return nil, fmt.Errorf("session: unknown provide %q (forgotten import?)", provideName)
- }
- return &Manager{provider: provider, cookieName: cookieName, maxLifeTime: maxLifeTime}, nil
- }
- package memory
- import (
- "container/list"
- "github.com/astaxie/session"
- "sync"
- "time"
- )
- //内存存储的session机制
- var pder = &Provider{list: list.New()}
- type SessionStore struct {
- sid string //session id唯一标示
- timeAccessed time.Time //最后访问时间
- value map[interface{}]interface{} //session里面存储的值
- }
- func (st *SessionStore) Set(key, value interface{}) error {
- st.value[key] = value
- pder.SessionUpdate(st.sid)
- return nil
- }
- func (st *SessionStore) Get(key interface{}) interface{} {
- pder.SessionUpdate(st.sid)
- if v, ok := st.value[key]; ok {
- return v
- } else {
- return nil
- }
- }
- func (st *SessionStore) Delete(key interface{}) error {
- delete(st.value, key)
- pder.SessionUpdate(st.sid)
- return nil
- }
- func (st *SessionStore) SessionID() string {
- return st.sid
- }
- type Provider struct {
- lock sync.Mutex //用来锁
- sessions map[string]*list.Element //用来存储在内存
- list *list.List //用来做gc
- }
- func (pder *Provider) SessionInit(sid string) (session.Session, error) {
- pder.lock.Lock()
- defer pder.lock.Unlock()
- v := make(map[interface{}]interface{}, 0)
- newsess := &SessionStore{sid: sid, timeAccessed: time.Now(), value: v}
- element := pder.list.PushBack(newsess)
- pder.sessions[sid] = element
- return newsess, nil
- }
- func (pder *Provider) SessionRead(sid string) (session.Session, error) {
- if element, ok := pder.sessions[sid]; ok {
- return element.Value.(*SessionStore), nil
- } else {
- sess, err := pder.SessionInit(sid)
- return sess, err
- }
- return nil, nil
- }
- func (pder *Provider) SessionDestroy(sid string) error {
- if element, ok := pder.sessions[sid]; ok {
- delete(pder.sessions, sid)
- pder.list.Remove(element)
- return nil
- }
- return nil
- }
- func (pder *Provider) SessionGC(maxlifetime int64) {
- pder.lock.Lock()
- defer pder.lock.Unlock()
- for {
- element := pder.list.Back()
- if element == nil {
- break
- }
- if (element.Value.(*SessionStore).timeAccessed.Unix() + maxlifetime) < time.Now().Unix() {
- pder.list.Remove(element)
- delete(pder.sessions, element.Value.(*SessionStore).sid)
- } else {
- break
- }
- }
- }
- func (pder *Provider) SessionUpdate(sid string) error {
- pder.lock.Lock()
- defer pder.lock.Unlock()
- if element, ok := pder.sessions[sid]; ok {
- element.Value.(*SessionStore).timeAccessed = time.Now()
- pder.list.MoveToFront(element)
- return nil
- }
- return nil
- }
- func init() { //自动运行init函数
- pder.sessions = make(map[string]*list.Element, 0)
- session.Register("memory", pder)
- }
go web cookie和session的更多相关文章
- web cookie and session
一.什么是会话? 打开一个浏览器,访问多个网址后,再关掉浏览器,这一整个过程就是会话. 二.cookie技术 这是客户端保存临时数据的技术,主要用于保存用户的登录信息及其它需要保存的数据,如购买与结帐 ...
- Java Web(三) 会话机制,Cookie和Session详解
很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...
- web框架开发-Django组件cookie与session
http协议的每一次都是无保存状态的请求,这会带来很多的不方便,比如,一刷新网页,或者进入该网页的其他页面,无法保存之前的登录状态.为了解决类似这样的问题,引入了会话跟踪 会话跟踪技术 1 什么是会话 ...
- web存储中cookie、session区别
http协议是一种无状态的协议,浏览器对服务器的每一次请求都是独立的.为了使得web能够产生一些动态信息,就需要保存”状态”,而cookie和session机制就是为了解决http协议无状态而产生.c ...
- Java Web 开发必须掌握的三个技术:Token、Cookie、Session
在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie ...
- Java Web(三) 会话机制,Cookie和Session详解(转载)
https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...
- Java开发工程师(Web方向) - 02.Servlet技术 - 第2章.Cookie与Session
第2章--Cookie与Session Cookie与Session 浏览器输入地址--HTTP请求--Servlet--HTTP响应--浏览器接收 会话(session):打开浏览器,打开一系列页面 ...
- Java Web Application使Session永不失效(利用cookie隐藏登录)
在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...
- Session or Cookie?是否需要用Tomcat等Web容器的Session
Cookie是HTTP协议标准下的存储用户信息的工具,浏览器把用户信息存放到本地的文本文件中. Session是基于Cookie实现的. 2011年4月,武汉群硕面试的时候(实习生),面试官也问过这个 ...
随机推荐
- SQL获取本周,上周,本月,上月的开始时间和结束时间
),),--本周 ),),--上周 ),),--本月 ),),--上月 ),),--近半年 ),)--近一年 ), ,, ),)--本周开始时间 ), ,, ),)--本周结束时间 ),,, ),)- ...
- centos开启IPV6配置方法
目前国内大部分服务器和PC不支持IPV6地址的,但是服务器上本身是可以正常开启IPV6服务,有部分程序在服务器上运行的时候,需要服务器能监听一个ipv6地址才行,因此本文档指导如何在centos服务器 ...
- python入门2 python字符串换行显示、字符串太长\连接多行
#coding:utf-8 #/usr/bin/python """ 2018-11-03 dinghanhua 缩进 换行 """ &qu ...
- Android(java)学习笔记32:Android布局详解之一:FrameLayout
1. FrameLayout是最简单的布局了.所有放在布局里的控件,都按照层次堆叠在屏幕的左上角.后加进来的控件覆盖前面的控件. 在FrameLayout布局里,定义任何空间的位置相关的属性都毫无意义 ...
- [SCOI2014]方伯伯运椰子
嘟嘟嘟 01分数规划思维题. 题中要求交通总量不减少,那么如果总量增加的话,总费用就会增加,所以一定不是更优的解.那么总量守恒. 这是不是就想到了网络流?对于每一个节点流入量等于流出量.然后就是很有思 ...
- 卸载由源码编译安装的软件(如OpenCV)
看安装软件的时候有没有使用--prefix这个参数,如果有那就把你指定的文件给删除了就行了. 如果没有用这个参数就麻烦一点了,那就进入到软件解压后的目录,执行sudo make uninstall看能 ...
- 【洛谷P3469】[POI2008]BLO-Blockade
BLO-Blockade 题目链接 若一个点为割点:统计出每个子树的大小,两两相乘再相加, 再加上n-1,为这个点与其他点的拜访数, 因为拜访是互相的,最后再乘二即可 若一个点不是割点:只有(n-1) ...
- grunt_beginner
前端集成解决方案:一套包含框架 和 工具,便于开发者快速构建美丽实用的web应用程序的工作流,同时 这套工作流必须是稳健强壮的. Yeman Bower web包管理器 框架.库.公共部分 Grunt ...
- papers-06-02
午睡被同事吵醒,只好干活.看到微信公众号有一篇文章说老朋友呢,点进去发现原来相关的工作好多,而且好新好细致. 微信的文章可以见这里: 探究最陌生的老朋友Softmax 里面的几篇文章可以看看. Lar ...
- ProjectServer如何创建时间表
默认配置的ProjectServer是没有时间表的,任务汇报的时候不能汇报工时,只能汇报任务的百分比. 但如果有企业一定要用工时来汇报的话,我们就需要开启时间表. 点击服务器设置-->时间报告阶 ...