I have a login page (login.html) that uses Javascript to call a golang service on the back end. Upon successful login, the user should be taken to a dashboard page (dashboard.html). Instead, the dashboard page opens up in the middle of the login page as shown here:
The relevant code is:
func userhandler(w http.ResponseWriter, r *http.Request, subcommand string) {
...
// If the credentials are valid, go to the Dashboard page
if validateLoginCredentials([]byte(loginUsername), []byte(loginPassword)) != -1 {
http.Redirect(w, r, "/dashboard.html", 302) //<<<<<<<<<The Redirect is here
}
...
}
func webhandler(w http.ResponseWriter, r *http.Request) { ...
// Service the API
if strings.HasPrefix(r.URL.Path, "/xyzzy/") {
urlparts := strings.SplitN(r.URL.Path, "/", 5) ...
switch urlparts[3] {
case "user":
userhandler(w, r, urlparts[4]) ...
}
}
} else { // Serve the static pages
http.FileServer(http.Dir(".")).ServeHTTP(w, r)
}
...
}
func main {
...
http.HandleFunc("/", webhandler) ...
err_https := http.ListenAndServeTLS(":3001", "./xyzzy.crt", "./xyzzy.key", nil)
...
}
If, as a test, I put the redirect into the spot where it serves the static pages (all static pages will redirect to the dashboard page), it looks like it works. But, in the code that handles the user api functions, like login, I get this behavior.
HTML Snippet:
<body>
<div class="logintopspacer" id="logintopspacerid"></div>
<div class="loginlogo" id="loginlogoid"><img src="img/pixmover1.png" alt="PixMover" width="270"></div>
<div class="logintitlecontainer" id="logintitlecontainerid">
<div class="logintitle" id="logintitleid">User Login</div>
</div>
<div class="loginmidspacer" id="loginmidspacerid"></div>
<div class="logincredentialscontainer" id="logincredentialscontainerid">
<div class="logincredentialsspacer"></div>
<div class="logincredentialtitle">Username/Email:</div>
<div class="logincredentialentry"><input type="text" name="pixun" id="pixunid" size="25"></div>
<div class="logincredentialsspacer"></div>
<div class="logincredentialsspacer"></div>
<div class="logincredentialtitle">Password:</div>
<div class="logincredentialentry"><input type="password" name="pixpw" id="pixpwid" size="25"></div>
<div class="logincredentialsspacer"></div>
</div>
<div class="loginbuttoncontainer" id="loginbuttoncontainerid">
<div class="loginbutton" id="loginbuttonid" onmousedown="buttonPressed();" onmouseup="submitForm();" onmouseout="buttonReleased();" >Login</div>
</div>
<div class="loginerrormessage" id="loginerrormessageid"></div>
<div class="loginbottomspacer" id="loginbottomspacerid"></div>
<div class="pagefooter" id="pagefooterid">
Copyright © XYZZY, Inc. 2016
</div>
</body>
Javascript:
function submitForm()
{
document.getElementById("loginbuttonid").className = "loginbutton";
pixlogin();
}
function pixlogin()
{
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function()
{
if (xhttp.readyState == 4 && xhttp.status == 200)
{
document.getElementById("loginerrormessageid").innerHTML = xhttp.responseText;
}
};
xhttp.open("POST", "pixmover/1_0_0/user/login", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("username=" + document.getElementById("pixunid").value + "&password=" + document.getElementById("pixpwid").value);
}
I believe this is coming from your
if (xhttp.readyState == 4 && xhttp.status == 200)
{
document.getElementById("loginerrormessageid").innerHTML = xhttp.responseText;
}
When the redirect comes back you're getting the entire page and it's just loading it in to the error message because there is no conditionals. You might want to do something instead like
if (isAuthenticated) {
location.href = "/"; // whatever page to redirect to
}