{"id":16828074,"url":"https://github.com/kataras/go-sessions","last_synced_at":"2025-04-06T00:10:49.886Z","repository":{"id":10881795,"uuid":"67271566","full_name":"kataras/go-sessions","owner":"kataras","description":":closed_lock_with_key: The sessions manager for the Go Programming Language. Supports both net/http and fasthttp.","archived":false,"fork":false,"pushed_at":"2023-11-14T20:30:45.000Z","size":4579,"stargazers_count":213,"open_issues_count":16,"forks_count":47,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-03-29T23:10:04.173Z","etag":null,"topics":["fasthttp","go","golang","high-performance","iris","iris-golang","nethttp","sessions"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kataras.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null},"funding":{"github":"kataras"}},"created_at":"2016-09-03T04:42:06.000Z","updated_at":"2025-01-29T22:11:08.000Z","dependencies_parsed_at":"2024-02-17T08:43:57.712Z","dependency_job_id":null,"html_url":"https://github.com/kataras/go-sessions","commit_stats":{"total_commits":66,"total_committers":8,"mean_commits":8.25,"dds":0.4696969696969697,"last_synced_commit":"2a50e79ae6a46b0cca3659682de8a582aa97dd71"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kataras%2Fgo-sessions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kataras%2Fgo-sessions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kataras%2Fgo-sessions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kataras%2Fgo-sessions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kataras","download_url":"https://codeload.github.com/kataras/go-sessions/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247415973,"owners_count":20935387,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fasthttp","go","golang","high-performance","iris","iris-golang","nethttp","sessions"],"created_at":"2024-10-13T11:24:32.714Z","updated_at":"2025-04-06T00:10:49.868Z","avatar_url":"https://github.com/kataras.png","language":"Go","funding_links":["https://github.com/sponsors/kataras"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\n\u003cimg  width=\"600\" src=\"https://github.com/kataras/go-sessions/raw/master/logo_900_273_bg_white.png\"\u003e\n\u003cbr/\u003e\u003cbr/\u003e\n\n \u003ca href=\"https://github.com/kataras/go-sessions/actions\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/kataras/go-sessions/ci.yml?style=float-square\" alt=\"Build Status\"\u003e\u003c/a\u003e\n \u003ca href=\"https://github.com/kataras/go-sessions/blob/master/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/%20license-MIT%20%20License%20-E91E63.svg?style=flat-square\" alt=\"License\"\u003e\u003c/a\u003e\n \u003ca href=\"https://github.com/kataras/go-sessions/releases\"\u003e\u003cimg src=\"https://img.shields.io/badge/%20release%20-%20v3.3.0-blue.svg?style=flat-square\" alt=\"Releases\"\u003e\u003c/a\u003e\n \u003ca href=\"#documentation\"\u003e\u003cimg src=\"https://img.shields.io/badge/%20docs-reference-5272B4.svg?style=flat-square\" alt=\"Read me docs\"\u003e\u003c/a\u003e\n \u003ca href=\"https://kataras.rocket.chat/channel/go-sessions\"\u003e\u003cimg src=\"https://img.shields.io/badge/%20community-chat-00BCD4.svg?style=flat-square\" alt=\"Build Status\"\u003e\u003c/a\u003e\n \u003ca href=\"https://golang.org\"\u003e\u003cimg src=\"https://img.shields.io/badge/powered_by-Go-3362c2.svg?style=flat-square\" alt=\"Built with GoLang\"\u003e\u003c/a\u003e\n \u003ca href=\"#\"\u003e\u003cimg src=\"https://img.shields.io/badge/platform-All-yellow.svg?style=flat-square\" alt=\"Platforms\"\u003e\u003c/a\u003e\n\u003cbr/\u003e\n\n\u003ca href=\"#features\" \u003eFast\u003c/a\u003e http sessions manager for Go.\u003cbr/\u003e\nSimple \u003ca href =\"#outline\"\u003eAPI\u003c/a\u003e, while providing robust set of features such as immutability, expiration time (can be shifted), [databases](sessiondb) like badger and redis as back-end storage.\u003cbr/\u003e\n\n\u003c/p\u003e\n\nQuick view\n-----------\n\n```go\nimport \"github.com/kataras/go-sessions/v3\"\n\nsess := sessions.Start(http.ResponseWriter, *http.Request)\nsess.\n  ID() string\n  Get(string) interface{}\n  HasFlash() bool\n  GetFlash(string) interface{}\n  GetFlashString(string) string\n  GetString(key string) string\n  GetInt(key string) (int, error)\n  GetInt64(key string) (int64, error)\n  GetFloat32(key string) (float32, error)\n  GetFloat64(key string) (float64, error)\n  GetBoolean(key string) (bool, error)\n  GetAll() map[string]interface{}\n  GetFlashes() map[string]interface{}\n  VisitAll(cb func(k string, v interface{}))\n  Set(string, interface{})\n  SetImmutable(key string, value interface{})\n  SetFlash(string, interface{})\n  Delete(string)\n  Clear()\n  ClearFlashes()\n```\n\nInstallation\n------------\n\nThe only requirement is the [Go Programming Language](https://golang.org/dl), at least 1.14.\n\n```bash\n$ go get github.com/kataras/go-sessions/v3\n```\n\n**go.mod**\n\n```mod\nmodule your_app\n\ngo 1.19\n\nrequire (\n\tgithub.com/kataras/go-sessions/v3 v3.3.1\n)\n```\n\nFeatures\n------------\n\n- Focus on simplicity and performance.\n- Flash messages.\n- Supports any type of [external database](_examples/database).\n- Works with both [net/http](https://golang.org/pkg/net/http/) and [valyala/fasthttp](https://github.com/valyala/fasthttp).\n\nDocumentation\n------------\n\nTake a look at the [./examples](https://github.com/kataras/go-sessions/tree/master/_examples) folder.\n\n- [Overview](_examples/overview/main.go)\n- [Standalone](_examples/standalone/main.go)\n- [Fasthttp](_examples/fasthttp/main.go)\n- [Secure Cookie](_examples/securecookie/main.go)\n- [Flash Messages](_examples/flash-messages/main.go)\n- [Databases](_examples/database)\n\t* [Redis](_examples/database/redis/main.go)\n\nOutline\n------------\n\n```go\n// Start starts the session for the particular net/http request\nStart(w http.ResponseWriter,r *http.Request) Session\n// ShiftExpiration move the expire date of a session to a new date\n// by using session default timeout configuration.\nShiftExpiration(w http.ResponseWriter, r *http.Request)\n// UpdateExpiration change expire date of a session to a new date\n// by using timeout value passed by `expires` receiver.\nUpdateExpiration(w http.ResponseWriter, r *http.Request, expires time.Duration)\n// Destroy kills the net/http session and remove the associated cookie\nDestroy(w http.ResponseWriter,r  *http.Request)\n\n// Start starts the session for the particular valyala/fasthttp request\nStartFasthttp(ctx *fasthttp.RequestCtx) Session\n// ShiftExpirationFasthttp move the expire date of a session to a new date\n// by using session default timeout configuration.\nShiftExpirationFasthttp(ctx *fasthttp.RequestCtx)\n// UpdateExpirationFasthttp change expire date of a session to a new date\n// by using timeout value passed by `expires` receiver.\nUpdateExpirationFasthttp(ctx *fasthttp.RequestCtx, expires time.Duration)\n// Destroy kills the valyala/fasthttp session and remove the associated cookie\nDestroyFasthttp(ctx *fasthttp.RequestCtx)\n\n// DestroyByID removes the session entry\n// from the server-side memory (and database if registered).\n// Client's session cookie will still exist but it will be reseted on the next request.\n//\n// It's safe to use it even if you are not sure if a session with that id exists.\n// Works for both net/http \u0026 fasthttp\nDestroyByID(string)\n// DestroyAll removes all sessions\n// from the server-side memory (and database if registered).\n// Client's session cookie will still exist but it will be reseted on the next request.\n// Works for both net/http \u0026 fasthttp\nDestroyAll()\n\n// UseDatabase ,optionally, adds a session database to the manager's provider,\n// a session db doesn't have write access\n// see https://github.com/kataras/go-sessions/tree/master/sessiondb\nUseDatabase(Database)\n```\n\n### Configuration\n\n```go\n// Config is the configuration for sessions. Please read it before using sessions.\nConfig struct {\n\t// Cookie string, the session's client cookie name, for example: \"mysessionid\"\n\t//\n\t// Defaults to \"irissessionid\".\n\tCookie string\n\n\t// CookieSecureTLS set to true if server is running over TLS\n\t// and you need the session's cookie \"Secure\" field to be setted true.\n\t//\n\t// Note: The user should fill the Decode configuation field in order for this to work.\n\t// Recommendation: You don't need this to be setted to true, just fill the Encode and Decode fields\n\t// with a third-party library like secure cookie, example is provided at the _examples folder.\n\t//\n\t// Defaults to false.\n\tCookieSecureTLS bool\n\n\t// AllowReclaim will allow to\n\t// Destroy and Start a session in the same request handler.\n\t// All it does is that it removes the cookie for both `Request` and `ResponseWriter` while `Destroy`\n\t// or add a new cookie to `Request` while `Start`.\n\t//\n\t// Defaults to false.\n\tAllowReclaim bool\n\n\t// Encode the cookie value if not nil.\n\t// Should accept as first argument the cookie name (config.Cookie)\n\t//         as second argument the server's generated session id.\n\t// Should return the new session id, if error the session id setted to empty which is invalid.\n\t//\n\t// Note: Errors are not printed, so you have to know what you're doing,\n\t// and remember: if you use AES it only supports key sizes of 16, 24 or 32 bytes.\n\t// You either need to provide exactly that amount or you derive the key from what you type in.\n\t//\n\t// Defaults to nil.\n\tEncode func(cookieName string, value interface{}) (string, error)\n\t// Decode the cookie value if not nil.\n\t// Should accept as first argument the cookie name (config.Cookie)\n\t//               as second second accepts the client's cookie value (the encoded session id).\n\t// Should return an error if decode operation failed.\n\t//\n\t// Note: Errors are not printed, so you have to know what you're doing,\n\t// and remember: if you use AES it only supports key sizes of 16, 24 or 32 bytes.\n\t// You either need to provide exactly that amount or you derive the key from what you type in.\n\t//\n\t// Defaults to nil.\n\tDecode func(cookieName string, cookieValue string, v interface{}) error\n\n\t// Encoding same as Encode and Decode but receives a single instance which\n\t// completes the \"CookieEncoder\" interface, `Encode` and `Decode` functions.\n\t//\n\t// Defaults to nil.\n\tEncoding Encoding\n\n\t// Expires the duration of which the cookie must expires (created_time.Add(Expires)).\n\t// If you want to delete the cookie when the browser closes, set it to -1.\n\t//\n\t// 0 means no expire, (24 years)\n\t// -1 means when browser closes\n\t// \u003e 0 is the time.Duration which the session cookies should expire.\n\t//\n\t// Defaults to infinitive/unlimited life duration(0).\n\tExpires time.Duration\n\n\t// SessionIDGenerator should returns a random session id.\n\t// By default we will use a uuid impl package to generate\n\t// that, but developers can change that with simple assignment.\n\tSessionIDGenerator func() string\n\n\t// DisableSubdomainPersistence set it to true in order dissallow your subdomains to have access to the session cookie\n\t//\n\t// Defaults to false.\n\tDisableSubdomainPersistence bool\n}\n```\n\n\nUsage NET/HTTP\n------------\n\n\n`Start` returns a `Session`, **Session outline**\n\n```go\nID() string\nGet(string) interface{}\nHasFlash() bool\nGetFlash(string) interface{}\nGetString(key string) string\nGetFlashString(string) string\nGetInt(key string) (int, error)\nGetInt64(key string) (int64, error)\nGetFloat32(key string) (float32, error)\nGetFloat64(key string) (float64, error)\nGetBoolean(key string) (bool, error)\nGetAll() map[string]interface{}\nGetFlashes() map[string]interface{}\nVisitAll(cb func(k string, v interface{}))\nSet(string, interface{})\nSetImmutable(key string, value interface{})\nSetFlash(string, interface{})\nDelete(string)\nClear()\nClearFlashes()\n```\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/kataras/go-sessions/v3\"\n)\n\ntype businessModel struct {\n\tName string\n}\n\nfunc main() {\n\tapp := http.NewServeMux()\n\tsess := sessions.New(sessions.Config{\n\t\t// Cookie string, the session's client cookie name, for example: \"mysessionid\"\n\t\t//\n\t\t// Defaults to \"gosessionid\"\n\t\tCookie: \"mysessionid\",\n\t\t// it's time.Duration, from the time cookie is created, how long it can be alive?\n\t\t// 0 means no expire.\n\t\t// -1 means expire when browser closes\n\t\t// or set a value, like 2 hours:\n\t\tExpires: time.Hour * 2,\n\t\t// if you want to invalid cookies on different subdomains\n\t\t// of the same host, then enable it\n\t\tDisableSubdomainPersistence: false,\n\t\t// want to be crazy safe? Take a look at the \"securecookie\" example folder.\n\t})\n\n\tapp.HandleFunc(\"/\", func(w http.ResponseWriter, r *http.Request) {\n\t\tw.Write([]byte(fmt.Sprintf(\"You should navigate to the /set, /get, /delete, /clear,/destroy instead\")))\n\t})\n\tapp.HandleFunc(\"/set\", func(w http.ResponseWriter, r *http.Request) {\n\n\t\t//set session values.\n\t\ts := sess.Start(w, r)\n\t\ts.Set(\"name\", \"iris\")\n\n\t\t//test if setted here\n\t\tw.Write([]byte(fmt.Sprintf(\"All ok session setted to: %s\", s.GetString(\"name\"))))\n\n\t\t// Set will set the value as-it-is,\n\t\t// if it's a slice or map\n\t\t// you will be able to change it on .Get directly!\n\t\t// Keep note that I don't recommend saving big data neither slices or maps on a session\n\t\t// but if you really need it then use the `SetImmutable` instead of `Set`.\n\t\t// Use `SetImmutable` consistently, it's slower.\n\t\t// Read more about muttable and immutable go types: https://stackoverflow.com/a/8021081\n\t})\n\n\tapp.HandleFunc(\"/get\", func(w http.ResponseWriter, r *http.Request) {\n\t\t// get a specific value, as string, if no found returns just an empty string\n\t\tname := sess.Start(w, r).GetString(\"name\")\n\n\t\tw.Write([]byte(fmt.Sprintf(\"The name on the /set was: %s\", name)))\n\t})\n\n\tapp.HandleFunc(\"/delete\", func(w http.ResponseWriter, r *http.Request) {\n\t\t// delete a specific key\n\t\tsess.Start(w, r).Delete(\"name\")\n\t})\n\n\tapp.HandleFunc(\"/clear\", func(w http.ResponseWriter, r *http.Request) {\n\t\t// removes all entries\n\t\tsess.Start(w, r).Clear()\n\t})\n\n\tapp.HandleFunc(\"/update\", func(w http.ResponseWriter, r *http.Request) {\n\t\t// updates expire date\n\t\tsess.ShiftExpiration(w, r)\n\t})\n\n\tapp.HandleFunc(\"/destroy\", func(w http.ResponseWriter, r *http.Request) {\n\n\t\t//destroy, removes the entire session data and cookie\n\t\tsess.Destroy(w, r)\n\t})\n\t// Note about Destroy:\n\t//\n\t// You can destroy a session outside of a handler too, using the:\n\t// mySessions.DestroyByID\n\t// mySessions.DestroyAll\n\n\t// remember: slices and maps are muttable by-design\n\t// The `SetImmutable` makes sure that they will be stored and received\n\t// as immutable, so you can't change them directly by mistake.\n\t//\n\t// Use `SetImmutable` consistently, it's slower than `Set`.\n\t// Read more about muttable and immutable go types: https://stackoverflow.com/a/8021081\n\tapp.HandleFunc(\"/set_immutable\", func(w http.ResponseWriter, r *http.Request) {\n\t\tbusiness := []businessModel{{Name: \"Edward\"}, {Name: \"value 2\"}}\n\t\ts := sess.Start(w, r)\n\t\ts.SetImmutable(\"businessEdit\", business)\n\t\tbusinessGet := s.Get(\"businessEdit\").([]businessModel)\n\n\t\t// try to change it, if we used `Set` instead of `SetImmutable` this\n\t\t// change will affect the underline array of the session's value \"businessEdit\", but now it will not.\n\t\tbusinessGet[0].Name = \"Gabriel\"\n\n\t})\n\n\tapp.HandleFunc(\"/get_immutable\", func(w http.ResponseWriter, r *http.Request) {\n\t\tvalSlice := sess.Start(w, r).Get(\"businessEdit\")\n\t\tif valSlice == nil {\n\t\t\tw.Header().Set(\"Content-Type\", \"text/html; charset=UTF-8\")\n\t\t\tw.Write([]byte(\"please navigate to the \u003ca href='/set_immutable'\u003e/set_immutable\u003c/a\u003e first\"))\n\t\t\treturn\n\t\t}\n\n\t\tfirstModel := valSlice.([]businessModel)[0]\n\t\t// businessGet[0].Name is equal to Edward initially\n\t\tif firstModel.Name != \"Edward\" {\n\t\t\tpanic(\"Report this as a bug, immutable data cannot be changed from the caller without re-SetImmutable\")\n\t\t}\n\n\t\tw.Write([]byte(fmt.Sprintf(\"[]businessModel[0].Name remains: %s\", firstModel.Name)))\n\n\t\t// the name should remains \"Edward\"\n\t})\n\n\thttp.ListenAndServe(\":8080\", app)\n}\n```\n\n\nUsage FASTHTTP\n------------\n\n`StartFasthttp` returns the same object as `Start`, `Session`.\n\n```go\nID() string\nGet(string) interface{}\nHasFlash() bool\nGetFlash(string) interface{}\nGetString(key string) string\nGetFlashString(string) string\nGetInt(key string) (int, error)\nGetInt64(key string) (int64, error)\nGetFloat32(key string) (float32, error)\nGetFloat64(key string) (float64, error)\nGetBoolean(key string) (bool, error)\nGetAll() map[string]interface{}\nGetFlashes() map[string]interface{}\nVisitAll(cb func(k string, v interface{}))\nSet(string, interface{})\nSetImmutable(key string, value interface{})\nSetFlash(string, interface{})\nDelete(string)\nClear()\nClearFlashes()\n```\n\nWe have only one simple example because the API is the same, the returned session is the same for both net/http and valyala/fasthttp.\n\nJust append the word \"Fasthttp\", the rest of the API remains as it's with net/http.\n\n`Start` for net/http, `StartFasthttp` for valyala/fasthttp.\n`ShiftExpiration` for net/http, `ShiftExpirationFasthttp` for valyala/fasthttp.\n`UpdateExpiration` for net/http, `UpdateExpirationFasthttp` for valyala/fasthttp.\n`Destroy` for net/http, `DestroyFasthttp` for valyala/fasthttp.\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/kataras/go-sessions/v3\"\n\t\"github.com/valyala/fasthttp\"\n)\n\nfunc main() {\n// set some values to the session\nsetHandler := func(reqCtx *fasthttp.RequestCtx) {\n\tvalues := map[string]interface{}{\n\t\t\"Name\":   \"go-sessions\",\n\t\t\"Days\":   \"1\",\n\t\t\"Secret\": \"dsads£2132215£%%Ssdsa\",\n\t}\n\n\tsess := sessions.StartFasthttp(reqCtx) // init the session\n\t// sessions.StartFasthttp returns the, same, Session interface we saw before too\n\n\tfor k, v := range values {\n\t\tsess.Set(k, v) // fill session, set each of the key-value pair\n\t}\n\treqCtx.WriteString(\"Session saved, go to /get to view the results\")\n}\n\n// get the values from the session\ngetHandler := func(reqCtx *fasthttp.RequestCtx) {\n\tsess := sessions.StartFasthttp(reqCtx) // init the session\n\tsessValues := sess.GetAll()            // get all values from this session\n\n\treqCtx.WriteString(fmt.Sprintf(\"%#v\", sessValues))\n}\n\n// clear all values from the session\nclearHandler := func(reqCtx *fasthttp.RequestCtx) {\n\tsess := sessions.StartFasthttp(reqCtx)\n\tsess.Clear()\n}\n\n// destroys the session, clears the values and removes the server-side entry and client-side sessionid cookie\ndestroyHandler := func(reqCtx *fasthttp.RequestCtx) {\n\tsessions.DestroyFasthttp(reqCtx)\n}\n\nfmt.Println(\"Open a browser tab and navigate to the localhost:8080/set\")\nfasthttp.ListenAndServe(\":8080\", func(reqCtx *fasthttp.RequestCtx) {\n\tpath := string(reqCtx.Path())\n\n\tif path == \"/set\" {\n\t\tsetHandler(reqCtx)\n\t} else if path == \"/get\" {\n\t\tgetHandler(reqCtx)\n\t} else if path == \"/clear\" {\n\t\tclearHandler(reqCtx)\n\t} else if path == \"/destroy\" {\n\t\tdestroyHandler(reqCtx)\n\t} else {\n\t\treqCtx.WriteString(\"Please navigate to /set or /get or /clear or /destroy\")\n\t}\n})\n}\n```\n\nFAQ\n------------\n\nIf you'd like to discuss this package, or ask questions about it, feel free to\n\n * Explore [these questions](https://github.com/kataras/go-sessions/issues?go-sessions=label%3Aquestion).\n * Post an issue or  idea [here](https://github.com/kataras/go-sessions/issues).\n * Navigate to the [Chat][Chat].\n\n\n\nVersioning\n------------\n\nCurrent: **v3.3.0**\n\nRead more about Semantic Versioning 2.0.0\n\n - http://semver.org/\n - https://en.wikipedia.org/wiki/Software_versioning\n - https://wiki.debian.org/UpstreamGuide#Releases_and_Versions\n\nPeople\n------------\n\nThe author of go-sessions is [@kataras](https://github.com/kataras).\n\nContributing\n------------\n\nIf you are interested in contributing to the go-sessions project, please make a PR.\n\nLicense\n------------\n\nThis project is licensed under the MIT License.\n\nLicense can be found [here](LICENSE).\n\n[Travis Widget]: https://img.shields.io/travis/kataras/go-sessions.svg?style=flat-square\n[Travis]: http://travis-ci.org/kataras/go-sessions\n[License Widget]: https://img.shields.io/badge/license-MIT%20%20License%20-E91E63.svg?style=flat-square\n[License]: https://github.com/kataras/go-sessions/blob/master/LICENSE\n[Release Widget]: https://img.shields.io/badge/release-v3.3.0-blue.svg?style=flat-square\n[Release]: https://github.com/kataras/go-sessions/releases\n[Chat Widget]: https://img.shields.io/badge/community-chat-00BCD4.svg?style=flat-square\n[Chat]: https://kataras.rocket.chat/channel/go-sessions\n[ChatMain]: https://kataras.rocket.chat/channel/go-sessions\n[ChatAlternative]: https://gitter.im/kataras/go-sessions\n[Report Widget]: https://img.shields.io/badge/report%20card-A%2B-F44336.svg?style=flat-square\n[Report]: http://goreportcard.com/report/kataras/go-sessions\n[Documentation Widget]: https://img.shields.io/badge/docs-reference-5272B4.svg?style=flat-square\n[Documentation]: https://godoc.org/github.com/kataras/go-sessions\n[Language Widget]: https://img.shields.io/badge/powered_by-Go-3362c2.svg?style=flat-square\n[Language]: http://golang.org\n[Platform Widget]: https://img.shields.io/badge/platform-Any--OS-yellow.svg?style=flat-square\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkataras%2Fgo-sessions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkataras%2Fgo-sessions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkataras%2Fgo-sessions/lists"}