首页 > 其他分享 > go cookie && session

go cookie && session

时间:2023-04-06 22:11:51浏览次数:70  
标签:http name session Cookie go cookie byte

前言:

 HTTP 协议是无状态的,所以用户的每一次请求都是无状态的,

不知道在整个 Web 操作过程中哪些连接与该用户有关。

应该如何来解决这个问题呢?

Web 里面经典的解决方案是 Cookie 和 Session。

正文:

cookie 机制是一种客户端机制,把用户数据保存在客户端,

而 Session 机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息,每一个网站访客都会被分配给一个唯一的标识符,即 sessionID。

 

Session 是基于Cookie的。如果无法使用cookie,那么session也无法使用。

 

cookie的创建和使用示例:

通过 net/http 包中的 SetCookie 来设置 Cookie

func SetCookie(w ResponseWriter, cookie *Cookie)

设置cookie的参数列表

cookie1 := &http.Cookie{
   Name:  "name",   //名称
   Value: "guofucheng", //值
   MaxAge: 604800, //失效时间,单位秒 7天 7*24*60*60 ,默认 -1
   Path: "/" ,  //cookie的使用路径
   Domain: "",  //可以访问该Cookie的域名。
   Secure: false, //该Cookie是否仅被使用安全协议传输。默认为false
   HttpOnly: false, //仅支持http
}

maxAge

则该Cookie在maxAge秒之后失效。

如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1

Secure

该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false

path:

该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。

如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”

Domain

可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”

 

cookie实例1:设置和获取cookie

func setCookie(w http.ResponseWriter, r *http.Request) {

cookie1 := &http.Cookie{

Name:  "name",

Value: "guofucheng",

}

cookie2 := &http.Cookie{

Name:  "age",

Value: "66",

}

http.SetCookie(w, cookie1)

http.SetCookie(w, cookie2)

 

w.Write([]byte(string("set cookie success")))

}

 

func getCookie(w http.ResponseWriter, r *http.Request) {

//获取方式1

name, _ := r.Cookie("name")

age, _ := r.Cookie("age")

 

//获取方式2 r.Cookies

for _, c := range r.Cookies() {

fmt.Println(c.Value)

}

w.Write([]byte(name.Value))

w.Write([]byte(age.Value))

}

 

main:

http.HandleFunc("/setCookie", setCookie)

http.HandleFunc("/getCookie", getCookie)

 

http.ListenAndServe("127.0.0.1:80", nil)

 

 

 

Session的创建和使用:

Go 的标准库中并没有提供对 Sessoin 的实现,自己实现,或者第三方包。

go get -u github.com/gorilla/sessions

 

import (

"github.com/gorilla/sessions"

"net/http"

"os"

"strconv"

)

 

// 初始化session key

var store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))

 

func setSession(w http.ResponseWriter, r *http.Request) {

//设置sessionID

session, _ := store.Get(r, "GOSESSIONID")

session.Values["user_name"] = "liudehua"

session.Values["id"] = 5

//保存

session.Save(r, w)

w.Write([]byte(string("set session success")))

}

 

func getSessioin(w http.ResponseWriter, r *http.Request) {

session, _ := store.Get(r, "GOSESSIONID")

user_name := session.Values["user_name"]

id := session.Values["id"]

w.Write([]byte(user_name.(string)))

w.Write([]byte(strconv.Itoa(id.(int))))

}

 

main:

http.HandleFunc("/setSession", setSession)

http.HandleFunc("/getSessioin", getSessioin)

 

http.ListenAndServe("127.0.0.1:80", nil)

 

 

完结

标签:http,name,session,Cookie,go,cookie,byte
From: https://www.cnblogs.com/ypeih/p/17294406.html

相关文章

  • pycharm中配置MongoDB数据库出现未找到驱动程序类 'com.dbschema.MongoJdbcDriver' (v
      之前重新装了一下pycharm,发现MongoDB数据库连接时发生了错误。具体错误:未找到驱动程序类'com.dbschema.MongoJdbcDriver'(view)。这怎么解决呢?其实很简单,在驱动程序中选一个版本进行下载就好了。步骤如下:1、找到驱动程序,点击MongoDB,再点击+号。2、找到最新版本,点击下载......
  • 判断是否安装了Google地图
    判断是否安装了Google地图,没有弹出Dialog提示安装:/** *ForGoogleMapsCheck * *@return */ privatebooleanisGoogleMapsInstalled(){ try{ ApplicationInfoinfo=getPackageManager().getApplicationInfo( "com.google.andro......
  • (转)go深入:reflect 运行时反射
    原文:https://lingzihuan.icu/posts/go-13-depth-reflect/啥是反射go语言中,反射为我们提供了一种可以在运行时操作任意类型对象的能力,比如,查看一个接口变量的具体类型、看一个结构体有多少字段、修改某个字段的值等。比如 fmt.Println:funcPrintln(a...interface{})(nint,......
  • day7 golang GMP
    大名鼎鼎的GMP模型需要自行学习的知识:进程、线程、协程、多线程、线程池、io多路复用,内核态用户态,,同步阻塞异步非阻塞等等相关知识代码是在线程中运行的,协程也是,所以当协程阻塞的时候该线程也阻塞了,其他任务就无法调度了,该线程就死了。如何解决,那就需要让协程自由的在线程中移......
  • goodFeaturesToTrack
    一、goodFeaturesToTrack1、过程:1)函数查找图像中或指定图像区域中最突出的角点(1)函数使用cornerMinEigenVal或cornerHarris计算每个源图像像素的角点质量度量。(2)函数执行非最大值抑制(保留3x3邻域中的局部最大值)。(3)最小特征值小于qualityLevel*maxx,yqualityMeasureMap(x,y)......
  • Django之models
    常用字段and非常用字段autofieldint自增列,必须填入参数primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。但是这个基本咋没用过,建表也都是使用的默认idIntegerField一个整数类型,范围在-2147483648to2147483647CharField这个最常用,啥都能用他,......
  • JavaWeb-Cookie-16课-2023-04-06
    packagecom.feijian.servlet;importjavax.servlet.ServletException;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOExc......
  • Golang之常用方法[总结]
    1.有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?nums:=[]int{1,5,1,6,5,3,6}i:=0for_,v:=rangenums{i^=v}fmt.Print(i)重点是异或的使用......
  • (转)使用 Golang 创建和读取 Excel 文件
    原文:https://juejin.cn/post/7117578016858849293摘要本文提出一种使用Golang进行Excel文件创建和读取的方案。首先对问题进行分析,引出方案的基本架构;然后分章节描述了Excelize基础库的基本用法,以及Excel数据在Golang中的表示和解析方式,并进一步提出了应对大规模数......
  • GO框架 - gin简介
    Gin是一个用Go(Golang)编写的web框架。它是一个类似于martini但拥有更好性能的API框架,由于httprouter,速度提高了近40倍。如果你是性能和高效的追求者,你会爱上Gin.快速:基于Radix树的路由,小内存占用。没有反射。可预测的API性能。支持中间件:传入的HTTP请......