Servlet Fetch API gibt einen leeren String aus

RezaScript

Bekanntes Mitglied
Hallo,

ich möchte gerne mit Fetch API abfragen, ob das Login fehlgeschlagen wurde.

Java:
package ch.yourclick.zt;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@WebServlet("/login")
public class Login extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("username", req.getParameter("username"));
        req.setAttribute("password", req.getParameter("password"));

        Map<String, String> loginData = new HashMap<>();
        loginData.put("string", "username");

        // User is logged in
        if (Objects.requireNonNull(Database.getData("SELECT * FROM users WHERE username = '" + req.getParameter("username") + "' AND password = '" + req.getParameter("password") + "'", loginData)).contains(req.getParameter("username"))) {
            System.out.println("You are logged in");
            HttpSession session = req.getSession();
            session.setAttribute("loggedIn", true);
            req.getRequestDispatcher("/backend/welcome.jsp").forward(req, resp);
        }
        // Access denied
        else {
            PrintWriter writer = new PrintWriter(System.out);
            writer.write("Access denied!"); // <-- Das möchte ich ausgeben
        }

    }
}
Falls der User falsche Daten eingibt, möchte ich in der Browser-Konsole den String "Access denied" ausgeben.

Javascript:
const log = console.log.bind(console);

document.getElementById('login').addEventListener('submit', (e) => {
    e.preventDefault();
    fetch('login', {
        method: 'POST'
    })
    .then((response) => {
        return response.text();
    })
    .then((data) => {
        log(data);
    })
    .catch(err => {
        console.error(err);
    })
});

Komisch ist, dass mir der Browser einen leeren String ausgibt. Wie kann ich machen, dass er mir "Access denied" ausgibt?
 

JCODA

Top Contributor
Ohne viel Ahnung in der Materie zu haben, Google hat mir PrintWriter out = response.getWriter(); vorgeschlagen. System.out scheint unpassend zu sein.

Des weiteren solltest Du die SQL Abfrage mit Prepared Statements machen, da Du sonst durch SQL-Injection angreifbar bist.
( Ich kenne Database.getData nicht, aber kann es sein dass hier PreparedStatements über die übergebene Map realisiert werden?)
 

mihe7

Top Contributor
ich möchte gerne mit Fetch API abfragen, ob das Login fehlgeschlagen wurde.
Die Antwort auf das Problem hat Dir @JCODA schon gegeben. Hinzu kommt, dass man Passwörter nicht im Klartext speichert. Abgesehen davon: was hast Du eigentlich vor? Soweit ich das sehe, baust Du hier Application Managed Security auf Basis einer JDBC-Datenquelle ein. Das kannst Du Dir sparen, weil der Container das bereits kann.
 

RezaScript

Bekanntes Mitglied
@JCODA perfekt, dankeschön! response.getWriter() war genau das wonach ich suchte. Das mit dem Prepared Statement ist mir bewusst. Das ist mein nächster Schritt. :)

@mihe7 danke für den Hinweis! Dass das Passwort nicht im Klartext abgespeichert werden soll hatte ich völlig vergessen! Was ich vorhabe ist nur eine ganz einfache Login-Funktion. Im Browser habe ich den Username und das Passwort. Mein <form> hat aber kein method-Attribut. Ich benutze somit Fetch API, um mit Ajax auf die Seite /login (also die Java-Klasse Login) zugreifen zu können.
 

RezaScript

Bekanntes Mitglied
Dann spendier dem Element halt eins :)
Ist nicht nötig. Das Attribut gebe ich als Objekt mit Fetch API mit. Das Ziel war es, dass die Klasse Login mir einen Wert zurück gibt, ohne dass die Seite neu geladen wird.

Es reicht ja nicht, eine Loginseite zu haben. Du musst bei jedem Zugriff feststellen, ob der Benutzer angemeldet ist, außerdem wirst Du eine Sitzung haben wollen.
Das ist richtig aber das mache ich ja alles schon. In meinem Code siehst du, dass eine Session erstellt wird ...
Java:
session.setAttribute("loggedIn", true);
 

sascha-sphw

Top Contributor
Das ist richtig aber das mache ich ja alles schon. In meinem Code siehst du, dass eine Session erstellt wird ...
Java:
session.setAttribute("loggedIn", true);

Damit speicherst Du nur, dass sich der User zu dieser Session eingeloggt hat, was Du aber in weiteren Requests haben möchtest, ist der User, der zu dieser Session gehört.

Dennoch würde ich Dir raten Dich noch etwas detailierter mit dem Thema Security auseinander zu setzen, bevor Du diesen Code so Live stellst.
 

Ähnliche Java Themen

Neue Themen


Oben