我要創建HTTP處理程序來處理一個會話:如何取消訂閱http處理程序?
func init(){
http.HandleFunc("/sess/215489598", func(w http.ResponseWriter, r *http.Request) {
//do something
})
}
,然後將其刪除會話結束時(到期)。
我該怎麼做?
我要創建HTTP處理程序來處理一個會話:如何取消訂閱http處理程序?
func init(){
http.HandleFunc("/sess/215489598", func(w http.ResponseWriter, r *http.Request) {
//do something
})
}
,然後將其刪除會話結束時(到期)。
我該怎麼做?
這是不能直接:一個HTTP多路複用器(型號ServeMux)不不公開刪除操作。
使用HTTP多路複用器進行會話管理是一個糟糕的主意。 HTTP服務的當前實現是kind of inefficient.它掃描每個URL的整個多路複用器表,所以處理得越多,性能就越差。對於一些路徑來說這沒問題,但是你不能以這種方式管理數百次會話,而不能管理數十萬次。
HTTP多路複用器需要某種同步才能用作會話管理工具。想象一下有一個Unhandle方法。如果您不處理路徑,您會希望多路複用器不再使用之前的數據處理路徑。但是,不同的夠程aren't guaranteed to see each other's changes to the same data without some kind of synchronization.因此,HTTP處理程序仍然可以看到多路複用器的舊觀點,然後用你以爲你註銷處理程序響應請求。
那麼,HTTP處理程序本身不能爲你 - 這樣做也不應該,因爲你沒有任何手段來同步會話的壽命。
爲"/sess/"
創建單個處理程序。該處理程序應該負責委派個人會話。它可以使用一個map[sessionID]sessionHandler
有效地做到這一點,可以管過通道的所有會話管理,讓單一的goroutine跟蹤會話被創建和銷燬,或周圍使用會話映射讀寫鎖用更傳統的方法去。這樣,您可以確保在刪除它之後不會嘗試向會話處理程序發送新請求。
當然,你可以隨時得到一個HTTP請求,所以有人可能會在你鎖定地圖以刪除會話之前跳過並連接到一個會話,如果在你有指令後發生了上下文切換決定要鎖定地圖,但在實際執行之前,請仔細管理鎖定和會話策略。這裏要做的「正確的事情」主要取決於您的個人應用程序的需求。
恐怕golang http
包沒有實現的方法現在刪除或修改HTTP處理程序,請閱讀:
src/pkg/net/http/server.go
http://golang.org/src/pkg/net/http/server.go?s=28409:28496#L962
type ServeMux
func NewServeMux() *ServeMux
func (mux *ServeMux) Handle(pattern string, handler Handler)
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request))
func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)
它只是實現的寄存器功能HandleFunc()
。
你有2種方法來解決:
1修改源代碼來實現的註銷功能。這是不可取的,因爲直接使用ServerMux
不是一個好主意。
或者:
2也許你讓事情變得更加複雜。你只需要在一般的處理函數解析/sess/215489598
,例如:
func Handler(response http.ResponseWriter, request *http.Request) {
modules := strings.Split(request.URL.Path, "/")
if modules[1] == "sess" {
session_id := modules[2]
}
}
然後,你知道該怎麼做下一:)
如果您使用Gorilla grabit,它不需要爲每個請求掃描整個路由表。 – 2013-04-10 16:43:32