-2

我是 Golang 的新手。我已经制作了一个用于练习的演示应用程序,其中我有登录注册和主页。当我进入登录页面时,它会重定向到主页。我不明白发生了什么。

这是我的代码

package main

import (
    "database/sql"
    "fmt"
    "net/http"

    _ "github.com/go-sql-driver/mysql"
    "golang.org/x/crypto/bcrypt"
)

var db *sql.DB
var err error

func signupPage(res http.ResponseWriter, req *http.Request) {
    fmt.Println("entered Signup")
    if req.Method != "POST" {
        http.ServeFile(res, req, "template/signup.html")
        return
    }

    email := req.FormValue("email")
    password := req.FormValue("password")

    var user string

    err := db.QueryRow("SELECT email FROM users WHERE email=?", email).Scan(&user)

    switch {
    case err == sql.ErrNoRows:
        hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
        if err != nil {
            http.Error(res, "Server error, unable to create your account.", 500)
            return
        }

        _, err = db.Exec("INSERT INTO users(email, password) VALUES(?, ?)", email, hashedPassword)
        if err != nil {
            http.Error(res, "Server error, unable to create your account.", 500)
        }
        res.Write([]byte("User Registered Successfully"))
        return

    case err != nil:
        http.Error(res, "Server error, unable to create your account.", 500)
        return

    default:
        http.Redirect(res, req, "/", 301)
    }

}

func loginPage(res http.ResponseWriter, req *http.Request) {
    fmt.Println("Entered login")
    if req.Method != "POST" {
        http.ServeFile(res, req, "template/login.html")
        return
    }

    email := req.FormValue("email")
    password := req.FormValue("password")

    var dbemail string
    var dbpassword string

    err := db.QueryRow("SELECT email, password FORM users WHERE email=?", email).Scan(&dbemail, &dbpassword)
    if err != nil {
        http.Redirect(res, req, "/login", 301)
        return
    }

    err = bcrypt.CompareHashAndPassword([]byte(dbpassword), []byte(password))
    if err != nil {
        http.Redirect(res, req, "/login", 301)
        return
    }

    res.Write([]byte("Hello" + dbemail))

}

func homePage(res http.ResponseWriter, req *http.Request) {
    http.ServeFile(res, req, "template/landing.html")
}

func main() {
    db, err = sql.Open("mysql", "root:password@/golang_demo")
    if err != nil {
        panic(err.Error())
    } else {
        fmt.Println("Database connected successfully")
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        panic(err.Error())
    }
    http.HandleFunc("/login", loginPage)
    http.HandleFunc("/", homePage)
    http.HandleFunc("/signup", signupPage)

    http.ListenAndServe(":9090", nil)
}

当我进入注册页面时,它会成功。但是当我进入登录页面时,它会将我重定向到主页。请帮忙!

4

1 回答 1

2

这只是一个有根据的猜测,因为从我看到的代码来看,它看起来不应该发生。由于您使用的是301重定向(永久移动),我猜想在编写函数和测试它的某个时候,您做了一个重定向到主页。由于它是“永久移动”的,因此浏览器现在甚至不会询问服务器是否应该在看到该 URL 时重定向,它只是这样做。

如果您使用的是 chrome,请打开开发工具,然后禁用缓存应该可以解决它。或者更好的是,在您尚未在此站点上使用过的其他浏览器中尝试它,看看它是否在那里工作。

于 2019-02-07T18:34:00.500 回答