Browse Source

优化修改代码

niujiuru 1 month atrás
parent
commit
d095e65019
3 changed files with 35 additions and 30 deletions
  1. 6 6
      web-ui.service/web_handlers.go
  2. 23 18
      web-ui.service/web_session.go
  3. 6 6
      web-ui.service/web_ui.go

+ 6 - 6
web-ui.service/web_handlers.go

@@ -16,7 +16,7 @@ type LoginResp struct {
 	Success bool `json:"success"`
 }
 
-func loginHandler(w http.ResponseWriter, r *http.Request) {
+func WebLoginHandler(w http.ResponseWriter, r *http.Request) {
 	if r.Method != http.MethodPost {
 		w.WriteHeader(http.StatusMethodNotAllowed)
 		return
@@ -31,8 +31,8 @@ func loginHandler(w http.ResponseWriter, r *http.Request) {
 	ok := req.Username == "admin" && req.Password == "admin123456"
 
 	if ok {
-		sessionID := createSession()
-		addSession(sessionID)
+		sessionID := WebCreateSession()
+		WebAddSession(sessionID)
 
 		http.SetCookie(w, &http.Cookie{
 			Name:     "session_id",
@@ -47,7 +47,7 @@ func loginHandler(w http.ResponseWriter, r *http.Request) {
 	json.NewEncoder(w).Encode(LoginResp{Success: ok})
 }
 
-func logoutHandler(w http.ResponseWriter, r *http.Request) {
+func WebLogoutHandler(w http.ResponseWriter, r *http.Request) {
 	if cookie, err := r.Cookie("session_id"); err == nil {
 		sessionMu.Lock()
 		delete(sessions, cookie.Value)
@@ -64,7 +64,7 @@ func logoutHandler(w http.ResponseWriter, r *http.Request) {
 	http.Redirect(w, r, "/", http.StatusFound)
 }
 
-func (ui *WebUI) rootHandler(w http.ResponseWriter, r *http.Request) {
+func (ui *WebUI) WebRootHandler(w http.ResponseWriter, r *http.Request) {
 	path := r.URL.Path
 
 	w.Header().Set("Content-Type", "text/html; charset=utf-8")
@@ -73,7 +73,7 @@ func (ui *WebUI) rootHandler(w http.ResponseWriter, r *http.Request) {
 	w.Header().Set("Expires", "0")
 
 	// 1, 未登录时, 只能看登录页
-	if !checkSession(r) {
+	if !WebCheckSession(r) {
 		data, err := fs.ReadFile(ui.fs, "login.html")
 		if err != nil {
 			http.NotFound(w, r)

+ 23 - 18
web-ui.service/web_session.go

@@ -17,22 +17,24 @@ var (
 	sessions  = make(map[string]*sessionInfo)
 )
 
-// 默认5分钟无任何页面点击操作时, 超时
-const idleTimeout = 5 * time.Minute
+const (
+	idleTimeout = 5 * time.Minute
+	gcPeriod    = 1 * time.Hour
+)
 
-func createSession() string {
+func WebCreateSession() string {
 	buf := make([]byte, 32)
 	rand.Read(buf)
 	return hex.EncodeToString(buf)
 }
 
-func addSession(id string) {
+func WebAddSession(id string) {
 	sessionMu.Lock()
 	sessions[id] = &sessionInfo{last: time.Now()}
 	sessionMu.Unlock()
 }
 
-func hasSession(id string) bool {
+func WebHasSession(id string) bool {
 	now := time.Now()
 
 	sessionMu.Lock()
@@ -52,26 +54,29 @@ func hasSession(id string) bool {
 	return true
 }
 
-func checkSession(r *http.Request) bool {
+func WebCheckSession(r *http.Request) bool {
 	c, err := r.Cookie("session_id")
 	if err != nil {
 		return false
 	}
-	return hasSession(c.Value)
+	return WebHasSession(c.Value)
 }
 
-func sessionCleaner() {
-	ticker := time.NewTicker(3 * time.Minute)
-	defer ticker.Stop()
+func StartSessionCleaner() {
+	go func() {
+		ticker := time.NewTicker(gcPeriod)
+		defer ticker.Stop()
+
+		for range ticker.C {
+			now := time.Now()
 
-	for range ticker.C {
-		now := time.Now()
-		sessionMu.Lock()
-		for k, s := range sessions {
-			if now.Sub(s.last) > idleTimeout {
-				delete(sessions, k)
+			sessionMu.Lock()
+			for k, s := range sessions {
+				if now.Sub(s.last) > idleTimeout {
+					delete(sessions, k)
+				}
 			}
+			sessionMu.Unlock()
 		}
-		sessionMu.Unlock()
-	}
+	}()
 }

+ 6 - 6
web-ui.service/web_ui.go

@@ -24,17 +24,17 @@ func NewWebUI(addr string) (*WebUI, error) {
 	mux := http.NewServeMux()
 
 	fs := http.FileServer(http.FS(sub))
-	mux.Handle("/static/css/", fs) //////////// 页面样式
-	mux.Handle("/static/js/", fs)  //////////// 页面脚本
+	mux.Handle("/static/css/", fs) /////////////// 页面样式
+	mux.Handle("/static/js/", fs)  /////////////// 页面脚本
 
-	mux.HandleFunc("/login", loginHandler)   // 登录接口
-	mux.HandleFunc("/logout", logoutHandler) // 注销接口
+	mux.HandleFunc("/login", WebLoginHandler)   // 登录接口
+	mux.HandleFunc("/logout", WebLogoutHandler) // 注销接口
 
 	return &WebUI{fs: sub, addr: addr, mux: mux}, nil
 }
 
 func (ui *WebUI) Start() error {
-	go sessionCleaner()
-	ui.mux.HandleFunc("/", ui.rootHandler)
+	StartSessionCleaner() // session过期自动回收
+	ui.mux.HandleFunc("/", ui.WebRootHandler)
 	return http.ListenAndServe(ui.addr, ui.mux)
 }