我从以前的PHP获得会话
<?php
session_start();
$_SESSION["key"] = "val";
echo $_SESSION["key"];
?>
Run Code Online (Sandbox Code Playgroud)
在服务器端设置一个或多个密钥及其值,并能够检索或覆盖它,直到会话到期为止.
与大猩猩/会话相同
var(
sessionStore *sessions.CookieStore
sessionSecret []byte = make([]byte, 64)
session *sessions.Session
)
func init(){
sessionSecret = []byte("12345678901234567890123456789012")
sessionStore = sessions.NewCookieStore(sessionSecret)
session = sessions.NewSession(sessionStore, "session_name")
}
func SetSessionHandler(w http.ResponseWriter, r *http.Request) {
session, _ = sessionStore.Get(r, "session_name")
session.Values["key"] = "val"
session.Save(r, w)
}
func GetSessionHandler(w http.ResponseWriter, r *http.Request) {
session, _ = sessionStore.Get(r, "session_name")
fmt.FPrintln(session.Values["key"])
}
Run Code Online (Sandbox Code Playgroud)
现在我不明白大猩猩/背景的意义.我知道背景是什么但是......我不知道它是如何适应大局的.它说它受当前请求的约束.stackoverflow上的另一个问题是,在编写Per-Handler中间件的上下文中"简单地使用gorilla/context应该就足够了" .
但如果它的请求绑定...错误..语法错误,不计算.如果鸭子浮在水面上,那么巫婆就是用木头做的.因为如果她的重量与鸭子的重量相同,鸭子也漂浮在水面上,她必须是女巫.或类似的东西 ;)
当它受到请求约束时,它如何作为中间件"管理器"有用,我无法在全局设置它.您是否可以展示如何将大猩猩/会话与大猩猩/上下文一起使用的示例?
我想使用Redis进行会话管理.
但我无法弄清楚使用Redis作为Gorilla会话包的自定义后端直接使用它的优势是什么?
链接到Gorilla会话包:http://www.gorillatoolkit.org/pkg/sessions
我制作了一个应用程序,我需要将相同的文件提供给多个路由,因为前端是一个 React 应用程序。我一直在为路由器使用大猩猩复用器。文件结构如下:
main.go
build/
| index.html
| service-worker.js
static/
| js/
| main.js
| css/
| main.css
Run Code Online (Sandbox Code Playgroud)
这些文件假定它们位于文件目录的根目录中。所以在 html 文件中,他们被要求像'/static/js/main.js'。
在主要我的路线定义如下:
r.PathPrefix("/student").Handler(http.StripPrefix("/student",http.FileServer(http.Dir("build/")))).Methods("GET")
r.PathPrefix("/").Handler(http.FileServer(http.Dir("build/"))).Methods("GET")
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我可以在 '/' 和 '/student' 路由中获得 index.html 文件。如果我将它们放在“/student”路径的另一侧,则会出现 404 错误。所以我要问的是,是否有另一种方法可以为这两个路由提供相同的内容,以便我不必为我将在我的 Web 应用程序中拥有的每个视图定义一个路由。
我在golang中使用gorilla/mux包,但是有一些问题.第一个是我没有权限在我的应用程序上使用端口80,因为我无法从sudo运行应用程序,因为$GOPATH在使用sudo时没有设置.
这是我从程序中得到的错误:
$ go run app.go
2014/06/28 00:34:12 Listening...
2014/06/28 00:34:12 ListenAndServe: listen tcp :80: bind: permission denied
exit status 1
Run Code Online (Sandbox Code Playgroud)
我不确定当我修复sudo问题时它是否会工作,因为apache已经在使用端口80而且我不确定我的应用程序和apache是否可以"一起玩得很好".
关于如何解决这个问题的任何建议都会很棒.谢谢.
这是我的设置:我正在使用用户登录构建服务(使用Negroni和Gorilla),在登录时,用户获取会话cookie,服务器使用该cookie来授权受保护的端点.其中一个受保护的端点允许用户/客户端使用服务器打开websocket,如下所示:
app := negroni.New()
r := mux.NewRouter()
r.HandleFunc("/auth/connection", func(rw http.ResponseWriter, req *http.Request) {
// authorize request using req.Cookie("session_id")
// create websocket
conn, err := upgrader.Upgrade(rw, req, nil)
if err != nil {
panic(err)
}
defer conn.Close()
// do stuff...
})
app.UseHandler(r)
app.Run(":3000")
Run Code Online (Sandbox Code Playgroud)
但是,req.Cookies()总是空的,这意味着我不能授权任何请求"/auth/connection"- 而且我几乎肯定它不是websocket客户端的问题(如果你很好奇,我正在使用这个Python包测试它:https ://github.com/liris/websocket-client).我是否正确接近websocket的身份验证?
任何帮助/建议将不胜感激!
我是golang的新手,我正在尝试用最好的方式来解决这个问题.
我有一系列我静态定义和传递的路由gorilla/mux.我正在使用某些东西处理每个处理函数来处理请求和处理恐慌(主要是因为我可以理解包装是如何工作的).
我希望他们每个人都能够访问"上下文" - 一个每个http服务器一个结构,可能有数据库句柄,配置等等.我不想做的是使用静态全局变量.
我目前正在做的方式我可以给包装器访问上下文结构,但是我看不出如何将它放到实际的处理程序中,因为它希望它是一个http.HandlerFunc.我认为我能做的就是转换http.HandlerFunc成我自己的一种类型的接收器Context(并且对包装器做同样的事情,但是(经过多次玩)我无法Handler()接受这个.
我不禁想到我在这里遗漏了一些明显的东西.代码如下.
package main
import (
"fmt"
"github.com/gorilla/mux"
"html"
"log"
"net/http"
"time"
)
type Route struct {
Name string
Method string
Pattern string
HandlerFunc http.HandlerFunc
}
type Context struct {
route *Route
// imagine other stuff here, like database handles, config etc.
}
type Routes []Route
var routes = Routes{
Route{
"Index",
"GET",
"/",
index,
},
// imagine lots more routes here
}
func wrapLogger(inner …Run Code Online (Sandbox Code Playgroud) 这是我在localhost上运行的websocket ws://localhost:8080/ws
我需要go lang代码,可以创建一个websocket客户端并连接到这个服务器.
我的Google-Fu技能未能教会我一个简单的方法.
谢谢.
我看到Go本身有一个包net/http,足以提供启动和运行自己的REST API所需的一切.然而,有各种各样的框架,最流行的可能是大猩猩.
考虑到我需要做的主要事情之一是构建REST API,它通常会访问一些后端存储(数据库,缓存等)以执行CRUD操作,是否适合使用Go的标准库本身或者我应该考虑使用一些框架?
通常,人们编写新的库或框架来解决现有库中存在的问题.但是,当实际需求很简单时,许多框架也会使事情变得更糟.
所以我几乎没有问题:
go lang中的基本库是否足以支持REST的基本到中等功能?
如果我最终使用内置库并且明天必须改变它以使用某些框架(如大猩猩)那么努力将是多么困难/昂贵?
框架是真正解决问题还是只是简单地解决问题?
我非常感谢有人在这里分享他的想法(他自己做出这个选择),而我更多地研究自己的想法.
我研究过gorilla/websocket包的godoc。
在 Godoc 中明确指出,
并发连接支持一个并发读取器和一个并发写入器。
应用程序负责确保不超过一个 goroutine 同时调用写入方法(NextWriter、SetWriteDeadline、WriteMessage、WriteJSON、EnableWriteCompression、SetCompressionLevel),并且不超过一个 goroutine 调用读取方法(NextReader、SetReadDeadline、ReadMessage、ReadJSON、SetPongHandler) , SetPingHandler) 并发。
Close 和 WriteControl 方法可以与所有其他方法同时调用。
但是,在包提供的示例之一中
func (c *Conn) readPump() {
defer func() {
hub.unregister <- c
c.ws.Close()
}()
c.ws.SetReadLimit(maxMessageSize)
c.ws.SetReadDeadline(time.Now().Add(pongWait))
c.ws.SetPongHandler(func(string) error {
c.ws.SetReadDeadline(time.Now().Add(pongWait)); return nil
})
for {
_, message, err := c.ws.ReadMessage()
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
log.Printf("error: %v", err)
}
break
}
message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1))
hub.broadcast <- message
}
}
Run Code Online (Sandbox Code Playgroud)
来源:https : //github.com/gorilla/websocket/blob/a68708917c6a4f06314ab4e52493cc61359c9d42/examples/chat/conn.go#L50
这条线
c.ws.SetPongHandler(func(string) error …Run Code Online (Sandbox Code Playgroud) 在 Golang 应用程序中,我使用 gorilla/sessions 和 mySQL 后端在会话中存储数据,但我想将数据存储在 chi 路由器上下文中。如何将身份验证令牌字符串或结构添加到上下文中?我看到很多示例解释如何读取/使用它们,但我看到没有一个示例解释如何将数据插入登录函数中的上下文中。
例如,这里的chi 文档有以下代码来检查管理员用户,这对我有用,但它没有提供有关 auth 对象首先如何进入上下文的线索。还有另一个中间件函数描述如何将文章结构加载到上下文中并从 URL 获取其 id 参数,但这对我不起作用。我真的不想使用 cookie,因为这会破坏使用上下文的整个目的。
// AdminOnly middleware restricts access to just administrators.
func AdminOnly(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
isAdmin, ok := r.Context().Value("acl.admin").(bool)
if !ok || !isAdmin {
http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden)
return
}
next.ServeHTTP(w, r)
})
}
Run Code Online (Sandbox Code Playgroud)
在下面的示例中,我想在上下文中存储用户结构或身份验证令牌。
此外,我将如何处理上下文中的闪烁?我可以这样做还是应该坚持使用基于数据库的 Web 应用程序会话?
理想情况下,我想对服务模板的 Web 应用程序和单独的 API 应用程序使用相同的方法。
这是我的网络应用程序登录代码,进行了一些简化以消除繁琐的内容:
func (rs *appResource) login(w http.ResponseWriter, r *http.Request) {
// appResource contains db connection, …Run Code Online (Sandbox Code Playgroud)