Heim  >  Artikel  >  Backend-Entwicklung  >  Golang Gin: Der Titel steht bereits geschrieben. Sie möchten den Statuscode 301 mit 200 überschreiben

Golang Gin: Der Titel steht bereits geschrieben. Sie möchten den Statuscode 301 mit 200 überschreiben

PHPz
PHPznach vorne
2024-02-06 10:18:08469Durchsuche

Golang Gin:标题已经写好了。想要用 200 覆盖状态代码 301

Frageninhalt

Ich entwickle ein Control Panel und habe einige Leute damit beauftragt, es für mich zu bauen. Sie rannten alle weg und ich musste die Nudeln putzen.

Was ich tun muss ist:

  • Ziehen Sie die Anmeldeseite heraus
  • Überprüfen Sie die Anmeldeinformationen und veröffentlichen Sie das Formular
  • Nach erfolgreicher Veröffentlichung leiten Sie zur Dashboard-Seite weiter

Nur ein einfacher Anmeldevorgang. Das Problem besteht darin, dass die Konsole bei erfolgreicher Anmeldung in diese Umleitungsschleife wie folgt übergeht:

[gin] 2023/02/21 - 15:43:32 | 301 |  1.224601041s |             ::1 | post     "/login"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:33 | 200 |    787.3905ms |             ::1 | get      "/dashboard"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:33 | 200 |  197.989875ms |             ::1 | get      "/login"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:34 | 200 |  817.293166ms |             ::1 | get      "/dashboard"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:34 | 200 |  206.107791ms |             ::1 | get      "/login"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:35 | 200 |  792.954375ms |             ::1 | get      "/dashboard"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:35 | 200 |  201.972708ms |             ::1 | get      "/login"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:36 | 200 |  840.773625ms |             ::1 | get      "/dashboard"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:36 | 200 |  198.680125ms |             ::1 | get      "/login"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:37 | 200 |  897.679708ms |             ::1 | get      "/dashboard"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:37 | 200 |  200.759917ms |             ::1 | get      "/login"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:38 | 200 |   795.39975ms |             ::1 | get      "/dashboard"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:38 | 200 |     196.538ms |             ::1 | get      "/login"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:39 | 200 |  844.680709ms |             ::1 | get      "/dashboard"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:39 | 200 |  180.598084ms |             ::1 | get      "/login"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:40 | 200 |  814.666208ms |             ::1 | get      "/dashboard"
[gin-debug] [warning] headers were already written. wanted to override status code 301 with 200
[gin] 2023/02/21 - 15:43:40 | 200 |     210.281ms |             ::1 | get      "/login"

Im Moment bin ich noch dabei, Golang und Gin zu lernen bzw. neu darin zu sein, da ich einen älteren Entwickler vertrete, also ist es für mich einfach nur das Nötigste...

Soweit ich weiß, main()besteht darin, Routing und Middleware zu konfigurieren, Vorlagen zu laden und dann die Engine auszuführen.

main.go

func main() {
    //gin.setmode(gin.releasemode) // uncomment for production

    // startup tasks
    startup()
    logging.loginfo("ran startup tasks...")

    // configure engine
    hostport := fmt.sprintf(
        "%s:%d",
        datamanagers.loadconfig().bshost,
        datamanagers.loadconfig().bsport)
    webengine := gin.default()
    webengine.settrustedproxies([]string{hostport})
    logging.loginfo("configured engine...")

    // load middleware
    store := cookie.newstore([]byte(randstr.string(64)))
    webengine.use(sessions.sessions("session", store))
    webengine.use(errorhandler.errorshandler500())
    logging.loginfo("loaded middleware...")

    // configure routes
    pubroutes := webengine.group("/")
    privroutes := webengine.group("/")
    routes.publicroutes(pubroutes)
    privroutes.use(middleware.authrequired)
    routes.privateroutes(privroutes)
    logging.loginfo("configured routes...")

    // non routables
    webengine.noroute(errorhandler.errorshandler404())
    logging.loginfo("configured non-routables...")

    // load template files
    loadtemplates(webengine)
    logging.loginfo("loaded templates...")

    // start the gin engine
    err := webengine.run(hostport)
    logging.loginfo("...blocksuite-webui loaded")
    logging.catch(err)
}

Beim Zugriff auf / 时,我会被重定向到 /login wird das Anmeldeformular angezeigt.

Ich sende das Formular mit gültigen Anmeldeinformationen ab und es wird zu /dashboard weitergeleitet. Ich weiß nicht, ob die Umleitung nach erfolgreicher Anmeldung korrekt ist. Das hat der ursprüngliche Entwickler so gemacht und es funktioniert einwandfrei.

routes.go

func publicroutes(webengine *gin.routergroup) {
    webengine.get("/login", entry.logingethandler)
    webengine.post("/login", entry.loginposthandler)
    webengine.get("/", other.indexgethandler())
}
func privateroutes(webengine *gin.routergroup) {
    dashboardroutes := webengine.group("/dashboard")
    {
        dashboardroutes.get("/", dashboard.dashboardgethandler)
    }
}

login.go

func logingethandler(context *gin.context) {
    user := utility.getusersession(context).get("useremail")
    if user != nil {
        context.redirect(http.statusmovedpermanently, "/dashboard")
    }
    context.html(http.statusok, "login.html", gin.h{
        "sitekey":    datamanagers.getrecaptchasettings().sitekey,
        "enabled":    datamanagers.getrecaptchasettings().enabled,
        "content":    "",
        "success":    "",
        "serverlogo": brand.getbrandlogo(),
        "title":      "welcome back",
    })
}
func loginposthandler(context *gin.context) {
    user := utility.getusersession(context).get("useremail")
    if user != nil {
        context.redirect(http.statusmovedpermanently, "/dashboard")
        //return
    }
    useremail := utility.sanitize(context.postform("email"))
    password := utility.sanitize(context.postform("password"))
    rememberme := utility.sanitize(context.postform("rememberme"))
    //captcha := context.postform("g-recaptcha-response")
    if !utility.isemailvalid(useremail) {
        context.html(http.statusbadrequest, "login.html", gin.h{"content": "please enter a valid email address"})
        return
    }
    /*if helpers2.recaptchacheck(captcha) || datamanagers.getconfig().sitekey != "" {
        // success
    } else {
        if datamanagers.getconfig().enabled {
            context.html(http.statusbadrequest, "login.html", gin.h{"content": "please verify captcha"})
            return
        }
    }*/
    if utility.emptyuserpass(useremail, password) {
        context.html(http.statusbadrequest, "login.html", gin.h{"content": "email and password cannot be empty"})
        return
    }

    if utility.checkforwhitespaces(useremail, password) != nil {
        context.html(http.statusbadrequest, "login.html", gin.h{"content": "username and password can't contain spaces"})
        return
    }
    if !utility.checkuserpass(useremail, password) {
        context.html(http.statusunauthorized, "login.html", gin.h{"content": "incorrect username or password"})
        return
    }
    utility.newusersession(context, useremail)
    if rememberme == "yes" {
        utility.setsessionage(context)
    }
    context.redirect(http.statusmovedpermanently, "/dashboard")
}

Dann sollte die Seite /dashboard geladen werden.

dashboard.go

func dashboardgethandler(context *gin.context) {
    user := utility.getusersession(context).get("useremail")
    db := datamanagers.getdb()
    if user == nil {
        context.redirect(http.statusmovedpermanently, "/login")
    }
    [...]
    context.html(http.statusok, "dashboard.html", gin.h{
        "info":       info,
        "imageurl":   utility.getimage(user),
        "serverlogo": brand.getbrandicon(),
        "title":      "dashboard",
        "servername": datamanagers.getserverinfo().servername,
    })
}

(Im dashboard.go-Code habe ich den Code weggelassen, der die Daten in das Dashboard zieht, weil er lang war und ich es nicht für notwendig hielt.)

  • Ich habe alle Datenabfragen in Dashboard.go auskommentiert und eine einfache „Hallo“-Antwort hinzugefügt, aber dadurch sieht die Weiterleitung immer noch so aus. Ich weiß also, dass an der Art und Weise, wie diese Gofile-Datei die Daten extrahiert, nichts falsch ist.
  • Ich habe versucht, verschiedene HTTP-Antwortcodes wie http.statusok und keine Würfel zu verwenden.
  • Ich habe in Dashboard.go überprüft, dass die Sitzungsdaten tatsächlich geschrieben und gespeichert werden. Beim Laden des Dashboard-Get-Handlers kann ich die Sitzungsdaten ausgeben. Ich weiß also, dass die Sitzung gut läuft.
  • Ich habe die Art und Weise geändert, wie der Handler geschrieben ist. Bisher wurde es wie folgt kodiert:
func DashboardGetHandler() gin.HandlerFunc {
    return func(context *gin.Context) {
    [...]
    }
}

Ich habe absolut keine Ahnung, wohin ich als nächstes gehen soll. Danke!


Richtige Antwort


Vielen Dank an alle, die geholfen haben. Ich habe Kontakt mit dem vorherigen Entwickler aufgenommen und er hat mir geholfen, das Problem herauszufinden.

In seinem Code hat er eine Middleware-Funktion erstellt, die aus irgendeinem Grund die Sitzung erneut überprüft. Dieser Code sucht nach einer alten Variablen im Sitzungscookie, die nicht existiert. Also werde ich zum Anmeldebildschirm zurückgeworfen.

Also habe ich diese Middleware entfernt, da ich sie sowieso in login.go verwaltet habe.

Das obige ist der detaillierte Inhalt vonGolang Gin: Der Titel steht bereits geschrieben. Sie möchten den Statuscode 301 mit 200 überschreiben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen