Trước khi bắt đầu sử dụng phiên trong golang, tôi cần trả lời một số câu hỏi
ví dụ về phiên
nhập "github.com/gorilla/sessions"
var store = sessions.NewCookieStore([]byte("33446a9dcf9ea060a0a6532b166da32f304af0de"))
hàm Handler(w http.ResponseWriter, r *http.Request){
phiên, _ := store.Get(r, "tên-phiên")
session.Values["foo"] = "bar"
phiên.Giá trị[42] = 43
phiên.Lưu(r, w)
fmt.Fprint(w, "Xin chào thế giới :)")
}
hàm main(){
store.Options = &sessions.Options{
Tên miền: "localhost",
Con đường: "/",
Tuổi tối đa: 60 * 15,
Bảo mật: sai,
HttpOnly: đúng,
}
}
Quý đầu tiên:
Có thể thêm nhiều phiên với các tên khác nhau trên cùng một tên miền không?
session1, _ := store.Get(r, "tên-phiên-1")
session2, _ := store.Get(r, "tên-phiên-2")
Khi nào bạn cần nhiều phiên trên cùng một tên miền?
Quý 2:
Cách tốt nhất để nhận các biến từ phiên là gì? my_session_var = session.Values["foo"]
Quý 3:
Làm cách nào để kiểm tra xem phiên có được lưu chính xác không? Nếu bạn ghé thăm tương tự bản đồ
để thiết lập và nhận các biến?
gia hạn
gói chính
nhập khẩu (
"github.com/gorilla/sessions"
)
đã từng là (
lưu trữ = phiên.NewCookieStore([]byte("33446a9dcf9ea060a0a6532b166da32f304af0de"))
)
trình xử lý kiểu func(w http.ResponseWriter, r *http.Request, s *sessions.Session)
func (h trình xử lý) ServeHTTP(w http.ResponseWriter, r *http.Request){
phiên, _ := store.Get(r, "tên-phiên")
h(w, r, phiên)
}
hàm Handler_404(w http.ResponseWriter, r *http.Request, s *sessions.Session){
fmt.Fprint(w, "Ồ, có gì đó không ổn!")
}
错误
# đối số dòng lệnh
.\mux.go:101: không thể chuyển đổi Handler_404 (kiểu func(http.ResponseWriter, *http.Request, *sessions.Session)) thành kiểu http.HandlerFunc
bài báo"PHẦN MỞ RỘNG CƠ BẢN CỦA CÁC TRÌNH XỬ LÝ HTTP CỦA GO” (Simon Whitehead) hiển thị các ví dụ về thời điểm và vị trí để xác định phiên.
chứ không phải ở Người xử lý
chính nó và rất nhiều mã phải được sao chép khi xác định các trình xử lý khác.
sử dụng loại được đặt tên , bạn có thể xác định những gì bạn cầnNgười xử lý
:
trình xử lý kiểu func(w http.ResponseWriter, r *http.Request, db *mgo.Database)
(Trong trường hợp của bạn, đó sẽ là phiên gorilla chứ không phải phiên mgo hoặc cơ sở dữ liệu)
nhiệt()
chức năngCó thể xử lý việc tạo session (ở đây là mgo session, nhưng ý tưởng về session trong các framework khác thì giống nhau)
hàm init() {
phiên, lỗi = mgo.Dial("localhost")
nếu err != nil {
log.Println(lỗi)
}
}
Bạn có thể đảm bảo rằng loại chức năng này ('người xử lý
') tôn trọng Phục vụHTTP()
chức năng, lưu ý:
- quản lý phiên (sao chép/đóng)
Gọi trình xử lý thực tế của bạn (nó có thể có nhiều đối số hơn là chỉ TRONG
Và r
)
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s := phiên.Clone()
hoãn s. Đóng()
h(w, r, s.DB("ví dụ"))
}
Sau đó bạn có thể xác định thực tế của bạnNgười xử lý
(Một lần nữa, không chỉTRONG
Vàr
):
chức năng myHandler(w http.ResponseWriter, r *http.Request, db *mgo.Database) {
var người dùng []người dùng
db.C("người dùng").Tìm(nil).Tất cả(&người dùng)
đối với _, người dùng := phạm vi người dùng {
fmt.Fprintf(w, "%s là %d tuổi", user.Name, user.Age)
}
}
Bạn có thể sử dụng trình xử lý này trong máy chủ:
hàm main() {
mux := http.NewServeMux()
mux.Handle("/", trình xử lý(myHandler))
http.ListenAndServe(":8080", bộ nhớ)
}
Ý tưởng là để chủ yếu()
"Đường ống" bị hạn chế ở mức tối thiểu trong khi có một đường dẫn có nhiều tham số hơn (bao gồm cả phiên của bạn) Người xử lý
。
Điều này cho phép bạn sử dụng khác nhau Người xử lý
Yêu cầu rất ít đường ống, giữ chủ yếu()
Chỉ được sử dụng để khai báo các đường dẫn khác nhau (không dùng để khởi tạo phiên và trình xử lý)
Cập nhật 2019: Trong bối cảnh liên quan khác, xem thêm "Cách xử lý các phiên”.
Tôi là một lập trình viên xuất sắc, rất giỏi!