Golang中如何实现无效登录的代码处理

Golang中如何实现无效登录的代码处理

package main

import (
	"fmt"
	"net/http"

	"github.com/gorilla/mux"
	"github.com/gorilla/securecookie"
)

// cookie handling

var cookieHandler = securecookie.New(
	securecookie.GenerateRandomKey(64),
	securecookie.GenerateRandomKey(32))

func getUserName(request *http.Request) (userName string) {
	if cookie, err := request.Cookie("session"); err == nil {
		cookieValue := make(map[string]string)
		if err = cookieHandler.Decode("session", cookie.Value, &cookieValue); err == nil {
			userName = cookieValue["name"]
		}
	}
	return userName
}

func setSession(userName string, response http.ResponseWriter) {
	value := map[string]string{
		"name": userName,
	}
	if encoded, err := cookieHandler.Encode("session", value); err == nil {
		cookie := &http.Cookie{
			Name:  "session",
			Value: encoded,
			Path:  "/",
		}
		http.SetCookie(response, cookie)
	}
}

func clearSession(response http.ResponseWriter) {
	cookie := &http.Cookie{
		Name:   "session",
		Value:  "",
		Path:   "/",
		MaxAge: -1,
	}
	http.SetCookie(response, cookie)
}

// login handler

func loginHandler(response http.ResponseWriter, request *http.Request) {
	name := request.FormValue("name")
	pass := request.FormValue("password")
	redirectTarget := "/"
	if name != "" && pass != "" {
		// .. check credentials ..
		setSession(name, response)
		redirectTarget = "/internal"
	} else {
		redirectTarget = "/"
	}
	http.Redirect(response, request, redirectTarget, 302)
}

// logout handler

func logoutHandler(response http.ResponseWriter, request *http.Request) {
	clearSession(response)
	http.Redirect(response, request, "/", 302)
}

// index page

const indexPage = `
<h1>Login</h1>
<form method="post" action="/login">
	<label for="name">User name</label>
	<input type="text" id="name" name="name">
	<label for="password">Password</label>
	<input type="password" id="password" name="password">
	<button type="submit">Login</button>
</form>
`

func indexPageHandler(response http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(response, indexPage)
}

// internal page

const internalPage = `
<h1>Internal</h1>
<hr>
<small>User: %s</small>
<form method="post" action="/logout">
	<button type="submit">Logout</button>
</form>
`

func internalPageHandler(response http.ResponseWriter, request *http.Request) {
	userName := getUserName(request)
	if userName != "" {
		fmt.Fprintf(response, internalPage, userName)
	} else {
		http.Redirect(response, request, "/", 302)
	}
}

// server main method

var router = mux.NewRouter()

func main() {

	router.HandleFunc("/", indexPageHandler)
	router.HandleFunc("/internal", internalPageHandler)

	router.HandleFunc("/login", loginHandler).Methods("POST")
	router.HandleFunc("/logout", logoutHandler).Methods("POST")

	http.Handle("/", router)
	http.ListenAndServe(":8000", nil)
}

各位专家,如果用户名和密码为空,我该如何设置无效登录?我想在用户名和密码字段上方显示登录错误信息。谢谢


更多关于Golang中如何实现无效登录的代码处理的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

明白了

更多关于Golang中如何实现无效登录的代码处理的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


n_oandasan:

如果用户名和密码为空,如何设置无效登录。

你想在哪里设置什么?我不理解你的问题。

使用模板生成带或不带错误信息的登录页面。

这是页面内容。如果我点击带有内容的登录按钮,它会跳转。但当内容为空时,我想显示"无效"提示信息。 请问该如何实现?谢谢

Untitled

我可以这样写吗…那要怎么在页面上显示呢?

func loginHandler(response http.ResponseWriter, request *http.Request) {
name := request.FormValue("name")
pass := request.FormValue("password")
redirectTarget := "/"
if name != "" && pass != "" {
	// .. check credentials ..
	setSession(name, response)
	redirectTarget = "/internal"
} else {
    aaa = "Invalid Login"
}

在这段代码中,如果用户名和密码不为空,将跳转到内部页面;如果是空值,我想显示"登录无效"的提示信息。

func loginHandler(response http.ResponseWriter, request *http.Request) {
		name := request.FormValue("name")
		pass := request.FormValue("password")
		redirectTarget := "/"
		if name != "" && pass != "" {
			// .. check credentials ..
			setSession(name, response)
			redirectTarget = "/internal"
		} else {
			redirectTarget = "/"
		}
		http.Redirect(response, request, redirectTarget, 302)
	}

在您的代码中,当用户名或密码为空时,登录处理程序会重定向回首页,但不会显示错误信息。要实现无效登录的错误提示,您需要修改登录处理程序以在重定向时传递错误信息,并在首页处理程序中检查并显示该信息。

以下是修改后的代码示例:

package main

import (
	"fmt"
	"net/http"
	"net/url"

	"github.com/gorilla/mux"
	"github.com/gorilla/securecookie"
)

// cookie handling

var cookieHandler = securecookie.New(
	securecookie.GenerateRandomKey(64),
	securecookie.GenerateRandomKey(32))

func getUserName(request *http.Request) (userName string) {
	if cookie, err := request.Cookie("session"); err == nil {
		cookieValue := make(map[string]string)
		if err = cookieHandler.Decode("session", cookie.Value, &cookieValue); err == nil {
			userName = cookieValue["name"]
		}
	}
	return userName
}

func setSession(userName string, response http.ResponseWriter) {
	value := map[string]string{
		"name": userName,
	}
	if encoded, err := cookieHandler.Encode("session", value); err == nil {
		cookie := &http.Cookie{
			Name:  "session",
			Value: encoded,
			Path:  "/",
		}
		http.SetCookie(response, cookie)
	}
}

func clearSession(response http.ResponseWriter) {
	cookie := &http.Cookie{
		Name:   "session",
		Value:  "",
		Path:   "/",
		MaxAge: -1,
	}
	http.SetCookie(response, cookie)
}

// login handler

func loginHandler(response http.ResponseWriter, request *http.Request) {
	name := request.FormValue("name")
	pass := request.FormValue("password")
	
	if name == "" || pass == "" {
		// 重定向回首页并传递错误参数
		redirectTarget := "/?error=" + url.QueryEscape("用户名和密码不能为空")
		http.Redirect(response, request, redirectTarget, 302)
		return
	}
	
	// 这里可以添加实际的凭据验证逻辑
	// 例如,如果验证失败:
	// if !isValidCredentials(name, pass) {
	//     redirectTarget := "/?error=" + url.QueryEscape("无效的用户名或密码")
	//     http.Redirect(response, request, redirectTarget, 302)
	//     return
	// }
	
	setSession(name, response)
	http.Redirect(response, request, "/internal", 302)
}

// logout handler

func logoutHandler(response http.ResponseWriter, request *http.Request) {
	clearSession(response)
	http.Redirect(response, request, "/", 302)
}

// index page

const indexPage = `
<h1>Login</h1>
{{if .Error}}
<div style="color: red; margin-bottom: 10px;">
	{{.Error}}
</div>
{{end}}
<form method="post" action="/login">
	<label for="name">User name</label>
	<input type="text" id="name" name="name">
	<label for="password">Password</label>
	<input type="password" id="password" name="password">
	<button type="submit">Login</button>
</form>
`

func indexPageHandler(response http.ResponseWriter, request *http.Request) {
	// 从URL参数获取错误信息
	errorMsg := request.URL.Query().Get("error")
	
	data := struct {
		Error string
	}{
		Error: errorMsg,
	}
	
	// 简单的模板渲染
	page := indexPage
	if data.Error != "" {
		page = fmt.Sprintf(`<h1>Login</h1>
<div style="color: red; margin-bottom: 10px;">
	%s
</div>
<form method="post" action="/login">
	<label for="name">User name</label>
	<input type="text" id="name" name="name">
	<label for="password">Password</label>
	<input type="password" id="password" name="password">
	<button type="submit">Login</button>
</form>`, data.Error)
	} else {
		page = indexPage
	}
	
	fmt.Fprintf(response, page)
}

// internal page

const internalPage = `
<h1>Internal</h1>
<hr>
<small>User: %s</small>
<form method="post" action="/logout">
	<button type="submit">Logout</button>
</form>
`

func internalPageHandler(response http.ResponseWriter, request *http.Request) {
	userName := getUserName(request)
	if userName != "" {
		fmt.Fprintf(response, internalPage, userName)
	} else {
		http.Redirect(response, request, "/", 302)
	}
}

// server main method

var router = mux.NewRouter()

func main() {
	router.HandleFunc("/", indexPageHandler)
	router.HandleFunc("/internal", internalPageHandler)
	router.HandleFunc("/login", loginHandler).Methods("POST")
	router.HandleFunc("/logout", logoutHandler).Methods("POST")

	http.Handle("/", router)
	http.ListenAndServe(":8000", nil)
}

主要修改点:

  1. loginHandler 中,当用户名或密码为空时,通过URL参数传递错误信息:
redirectTarget := "/?error=" + url.QueryEscape("用户名和密码不能为空")
  1. indexPageHandler 中,从URL参数获取错误信息并显示:
errorMsg := request.URL.Query().Get("error")
  1. 修改了首页模板,添加了条件显示错误信息的逻辑。

这样,当用户提交空的用户名或密码时,页面会重定向回登录页面并显示相应的错误信息。您还可以扩展这个模式来处理其他类型的登录错误,比如无效凭据等。

回到顶部