Go&socket.io http + wss在一个带有CORS的端口上?

问题描述 投票:0回答:5

品牌新的。 我正在尝试使用一个简单的服务器: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

'

Edit#1:

因此,我一直在敲头,试图理解为什么我无法连接..遇到了一个更令人困惑的难题?

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_qtf1tas4exiwf
400(不良要求)
    

所以我使用googoolee的socket.io实现放弃了,然后与大猩猩一起使用。

I签出了他们的示例:

https://github.com/gorilla/websocket/tree/master/master/examples/chat

检查了他们的文档:

http://www.gorillatoolkit.org/pkg/websocket
- 我发现的原点考虑:
go websocket socket.io cors
5个回答
13
投票

ANAN应用程序可以通过指定始终返回true的函数来允许从任何原点进行连接:

var ustgrader = websocket.upgrader { checkorigin:func(r *http.request)bool {return true}, }

I在示例中将此

CheckOrigin函数添加到conn.go

文件中,并能够使CORS插座服务器与浏览器交谈。
作为Golang的第一次冒险,这令人沮丧和有趣。

不是您的意思是http + ws或https + wss。如果从WSS中删除S,则应该能够连接。

如果您需要Web插座(WSS)的TLS,则需要http.listenandservetls.

CORS似乎不适用于Websocket。根据“使用WebSocket,有一个“ Origin”标头,浏览器必须填充包含打开WS连接的JS的HTML的来源。

在这里说: sross Origin Websocket与Golang

    

在您的

3
投票
弹奏中,添加了类似的内容:

w.Header().Set("Access-Control-Allow-Origin", "*")

或可能更好:

1
投票
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软件包的实施:

0
投票
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处理服务器:

0
投票


为我工作

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.