品牌新的。 我正在尝试使用一个简单的服务器:8080可以响应http和socket.io(通过
/socket.io/
url),带有cors.
我的代码:
package main
import (
"log"
"net/http"
"github.com/rs/cors"
"github.com/googollee/go-socket.io"
)
func SayHelloWorld(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
}
func main() {
c := cors.New(cors.Options{
AllowedOrigins: []string{"*"},
AllowCredentials: true,
})
server, err := socketio.NewServer(nil)
if err != nil {
log.Fatal(err)
}
server.On("connection", func(so socketio.Socket) {
log.Println("on connection")
so.Join("chat")
so.On("chat message", func(msg string) {
log.Println("emit:", so.Emit("chat message", msg))
so.BroadcastTo("chat", "chat message", msg)
})
so.On("disconnection", func() {
log.Println("on disconnect")
})
})
server.On("error", func(so socketio.Socket, err error) {
log.Println("error:", err)
})
http.Handle("/socket.io/", c.Handler(server))
http.HandleFunc("/", SayHelloWorld)
log.Println("Serving at localhost:8080...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
在我仍然看到的客户方面:
weberocket连接到'wss://api.domain.com/socket.io/?eio = 3&transport = websocket&sid = xnwd9azvwdnzorxkobac'失败:Websocket在建立连接之前已关闭。(索引):1 xmlhttprequest不能加载
Https://api.domain.com/socket.io/?eio = 3&transport = polling&t = 1420662449235-3932&sid =xnwd9azvwdnzorxkobac
。请求的资源上没有“访问控制”标头。因此,不允许访问来源'http://fiddle.jshell.net因此,我一直在敲头,试图理解为什么我无法连接..遇到了一个更令人困惑的难题?'
https://gist.github.com/acoyfellow/167b055555248c94fc4 上面的要点是我的Golang Server +用于连接的浏览器代码的代码。此代码将发送30 HTTP获取请求每秒
秒而无需连接,升级或给出任何错误(客户端或服务器端) )..这本质上是DDOS是我自己的后端?
Edit#2:i可以通过简单地调整socket.io endpoint的the the the go .. so so:
/
mux.Handle("/socket.io", server)
现在将产生错误消息和连接尝试,并使用错误响应的错误响应来停止thailingmux.Handle("/socket.io/", server)
来停止“ ddos”。 :
WebSocket连接到'wss://api.domain.com/socket.io/?eio = 3&transport = websocket&sid = 0TZMTM_QTF1TAS4EXIWF'失败:Websocket握手时错误:Websocket握手:意外响应代码:400 socket.io-1.2.1.js:js:js::js::js::js::js::js::js::JS::JS::JS::JS::JS::JS::JS:: 2
get
https://api.domain.com/socket.io/?eio = 3&transport = polling&t = 1420743204485-62&sid =0tzmtm_qtf1tas4exiwf400(不良要求)
所以我使用googoolee的socket.io实现放弃了,然后与大猩猩一起使用。- 我发现的原点考虑:I签出了他们的示例:
https://github.com/gorilla/websocket/tree/master/master/examples/chathttp://www.gorillatoolkit.org/pkg/websocket
ANAN应用程序可以通过指定始终返回true的函数来允许从任何原点进行连接:
var ustgrader = websocket.upgrader { checkorigin:func(r *http.request)bool {return true}, }
I在示例中将此CheckOrigin
函数添加到conn.go
作为Golang的第一次冒险,这令人沮丧和有趣。
不是您的意思是http + ws或https + wss。如果从WSS中删除S,则应该能够连接。
如果您需要Web插座(WSS)的TLS,则需要http.listenandservetls.
CORS似乎不适用于Websocket。根据“使用WebSocket,有一个“ Origin”标头,浏览器必须填充包含打开WS连接的JS的HTML的来源。在这里说: sross Origin Websocket与Golang
在您的
w.Header().Set("Access-Control-Allow-Origin", "*")
或可能更好:
if origin := r.Header.Get("Origin"); origin != "" {
w.Header().Set("Access-Control-Allow-Origin", origin)
}
我使用普通的AJAX调用获得类似的临界器。它需要在前端和后端进行更多工作。我相信最受欢迎的前端libs liek jquery或angularjs很好地处理了这些。 我看到您正在使用Https://github.com/rs/cors
软件包,但您不包括该软件包的使用情况,这里是只有GO STD软件包的实施:type CrossOriginServer struct {}
func (s *CrossOriginServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
// you may need to add some more headers here
allowHeaders := "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization"
if origin := req.Header.Get("Origin"); validOrigin(origin) {
rw.Header().Set("Access-Control-Allow-Origin", origin)
rw.Header().Set("Access-Control-Allow-Methods", "POST, PUT, PATCH, GET, DELETE")
rw.Header().Set("Access-Control-Allow-Headers", allowHeaders)
}
if req.Method == "OPTIONS" {
return
}
// if you want, you can use gorilla/mux or any routing package here
mux := http.NewServeMux()
mux.Handle("/socket.io/", c.Handler(server))
mux.HandleFunc("/", SayHelloWorld)
mux.ServeHTTP(rw, req)
}
func validOrigin(origin string) bool {
allowOrigin := []string{
"http://localhost:8081",
"http://example.com"
}
for _, v := range allowOrigin {
if origin == v {
return true
}
}
return false
}
func main() {
// do you stuff
// ...
// ...
http.ListenAndServe(":8080", &CrossOriginServer{})
}
对我来说,它与
github.com/rs/cors
.一起效果很好。
AllowedOrigins: []string{"http://localhost:5173"}, //this is my frontend server
AllowedMethods: []string{"GET", "POST"},
AllowedHeaders: []string{"Content-Type"},
})
然后通过CorsHandler处理服务器: