# Fehlermeldung bei misslungener Anmeldung



## Kenan89 (9. Mai 2012)

Hallo,
wie kriege ich es mit JSP hin, dass bei einem Loginfenster eine Fehlermeldung erscheint, falls der Benutzer einen falschen Benutzernamen oder Passwort eingetragen hat?

Ich habe ein Formular auf meiner login.jsp. Beim Klick auf den Login Button wird man zu checkLogin.jsp weitergeleitet, welche ein Objekt einer Java Klasse LoginCheck.java erstellt. Dieser prüft mit einem preperadStatement nach, ob benutzername in Tabelle xy ist und dann ob das Passwort mit dem eingegebenen übereinstimmt. Dementsprechend wird in der Klasse ein boolean success auf true oder false gesetzt. 

Durch die Getter methode greift die checkLogin.jsp auf diesen Boolean zu und leitet User entweder zurück zum LoginFenster oder eben in die interne Seite falls Username und PW stimmen. Wenn man jetzt
aber zurück zur loginseite weitergeleitet wird, also zur login.jsp, wie kriege ich es hin, dass da ein Fehler erscheint? Ich kann ja der login.jsp keine Variable durch die checkLogin.jsp übergeben, wenn ich weiterleite.


----------



## Kenan89 (9. Mai 2012)

Okay, ich habe herausgefunden, dass das mit Sessions möglich ist. 
Man gibt ja Sessions einen key Value Wert, nämlich session.setAttribute("xy", "xy").

Jetzt kann man ja Sessions mit session.invalidate() löschen.
Dadurch wird aber der gesamte Session gelöscht. Kann ich nicht einen key Wert des Sessions löschen?
z.B. nur den xy wert im Beispiel oben?


----------



## SlaterB (9. Mai 2012)

warum sollte in dieser Situation in der Session überhaupt etwas gelöscht werden,
wo siehst du ein invalidate()? wer ruft das auf?
wenn es dir um die reinen fachlichen Daten geht, kannst du ja auch eine individuelle Löschung nur bestimmter Attribute
bzw. alle außer Ausnahmen durchführen

dann gibt es statt Session auch noch den Request, auch dort kann man Attribute ablegen,
das ist vielleicht generell die bessere Lösung hier


----------



## Kenan89 (10. Mai 2012)

Ich hätte eine Frage... 
Ich habe jetzt ein login-Skript geschrieben:

*login.jsp*

```
<!DOCTYPE html>
<html>
<head>
	<title>Login-Skript</title>
	<link rel="stylesheet" type="text/css" href="../css/style_loginseite.css" />
	<script type="text/javascript" src="../javascript/jquery-1.7.2.min.js"></script>
	<script type="text/javascript" src="../javascript/script.js"></script>
</head>
<body>

<div id="login">
	<div id="loginHeader">
		<p>Login</p>
	</div>
		
	<form autocomplete="off" method="post" action="../funktionen/checkLogin.jsp">
		<table>
			<tr>
				<td>
					<%
						HttpSession loginFehler = request.getSession();
						if(loginFehler.getAttribute("fehler")!=null){
							out.println("<span style='color: red; font-weight: bold;'>Please correct!</span>");
							loginFehler.invalidate();
						}
					%>
				</td>
			</tr>
			<tr>
				<td>
					Name:
   				</td>
				<td>
					<input type="text" name="username" />
				</td>
			</tr>
			<tr>
				<td>
					Passwort:
				</td>
				<td>
					<input type="password" name="password" />
				</td>
			</tr>
			<tr>
				<td>
					<br><button>Login</button>
				</td>
			</tr>
		</table>
	</form>	
</div>

</body>
</html>
```


checkLogin.jsp

```
<%@ page import="javax.servlet.http.HttpSession"%>
<%@ page import="database.Datenbankverbindung,database.LoginCheck"%>
<%@ page import="java.sql.Connection"%>
<%  
	String username = request.getParameter("username");
	String password = request.getParameter("password");
	boolean success;

	Connection conn = null;

	Datenbankverbindung datenbankverbindung = new Datenbankverbindung();
	datenbankverbindung.buildConnection();

	conn = datenbankverbindung.getConnection();

	LoginCheck logincheck = new LoginCheck(conn, username, password);
	logincheck.checkLogin();

	success = logincheck.getSuccess();//ein boolean wert der im servlet LoginCheck auf true/false gesetzt wird

	datenbankverbindung.closeConnection(conn);
	
	if (success) {
		session.setAttribute("username", username);
		response.sendRedirect("../ui/intern.jsp");
	} else {
		session.setAttribute("fehler", "fehler");
		response.sendRedirect("../ui/login.jsp");
	}	
%>
```

intern.jsp

```
<!DOCTYPE html>

<html>

<head>
	<title>piloFrog</title>
	<link rel="stylesheet" type="text/css" href="../css/style_frog.css">
	<script type="text/javascript" src="../javascript/jquery-1.7.2.min.js"></script>
	<script type="text/javascript" src="../javascript/script.js"></script>
</head>

<body>

	<div id="intern">		
		<table id="header">
			<tr>
				<td>
					Hallo, <% out.println(session.getAttribute("username")); %>
				</td>
				<td>
					<p id="logout"><a href="login.jsp">Logout</a></p>
				</td>
			</tr>
		</table>
		
		<div id="content">	
		</div>
	</div>
	<a href="login.jsp">zurück</a>
</body>

</html>
```


Die Frage ist, wie ich das mit den Sessions so hinkriege, dass der Browser, falls der user login.jsp aufruft, ihn nach intern.jsp umleitet, sofern die session.getAttribut("username") existiert.

EDIT:
Ich habe gelesen, man sollte sich eine neue session anlegen, damit keiner von jemanden die session klauen und sich als er anmelden kann. Geht das?


----------



## SlaterB (10. Mai 2012)

mit einfachen JSPs und Java-Code solltest du vorerst nicht über Session klauen nachdenken, soviel dazu,
Session anlegen praktisch auch nicht, passiert eher im Hintergrund wenn ich mich recht erinnere

checkLogin.jsp ist ja mal eine völlig verkehrte JSP, da wird überhaupt nichts angezeigt,
das einzige was du da erreichst, ist, eine komplette normale Java-Klasse umständlich in ein jsp-Textdokument reinzustecken,
ich weiß nicht ob es inzwischen IDEs gibt die das ganz normal bearbeiten, zu meiner Zeit mit JSPs wäre das jedenfalls ein Rückschritt auf Texteditor-Ebene

es gibt auch Servlets!, schon davon gehört? das sind ganz normale schöne Java-Klassen mit allen drum und dran,
JSPs werden ja letztlich intern auch zu Servlet-Klassen umgewandelt, der Hauptteil sollte HTML usw. sein was sich
wiederum in Java-Klassen nicht so schön einarbeiten läßt

------

ich rate dringends davon ab, je von einer JSP an andere weiterzuleiten, kann dir dabei also auch nicht weiterhelfen,
bzw. doch mit Vermutung: du müsstest eben login.jsp wie checkLogin.jsp aufbauen, dort gar nichts ausgeben sondern
an 'realyLogin.jsp' weiterleiten oder eben nicht

das korrekte Vorgehen in meinen Augen sieht vor, das ausnahmslos jeder Request immer erst zunächst an ein Servlet geht,
an eine richtig schöne Java-Klasse, dort wird alles geprüft was zu prüfen ist und entweder an die zugehörige JSP als normale Anzeige oder an Login oder Fehlerseite oder sonstiges verwiesen,
checkLogin.jsp ist ja wiegesagt so eine Vorstufe, nur als Servlet, 
und jede normale JSP, jeder Request ist ein zugehöriges Servlet wert, 
von Ausnahmen wie 20 gleichartige Gallerie-Seiten vielleicht abgesehen, die aber immer noch ein gemeinsames Servlet bzw. gewisse allgemeine Verarbeitung durchlaufen


----------



## Kenan89 (10. Mai 2012)

Wie kann ich aber dem Formular sagen, dass er bei action eine Java-Klasse laden soll. Meines Wissens nach kann man bei "action" nur jsp, html, php seiten, aber keine java klassen eingeben?


----------



## SlaterB (10. Mai 2012)

das hängt alles vom Framework ab,
ein Button erzeugt in erster Linie einen HTML-Request, der sogar an andere Webseiten gehen könnte, ganz ohne Java,
was fürs eigene Programm einzutragen ist, ist wie gesagt variabel,
und wird normalerweise in der web.xml an aufgelöst und weitergeleitet, je nach Framework gibts noch mehr Konfigurationsdateien,
bei dir lässt du vielleicht alles aus und referenzierst direkt JSPs,

Beispiele zu finden ist gerade gar nicht mal so leicht wie ich dachte,
hier nur eine Beispiel-web.xml,
Sample web.xml File
die wohl '/hello' auf das Servlet examples.Hello abbildet,

ah, dazu gehört ein ganzes Tutorial, hier gar eine Seite
Sample Default index.html File
die mit 

```
<li>To a <a href="hello.jsp">JSP page</a>.
      <li>To a <a href="hello">servlet</a>.
```
genau beide Möglichkeiten unterscheidet,
wie man es in Buttons/ Formulare einbaut ist wieder eine Grundlagenfrage,
ich kann nicht alles beantworten, das bisherige schon nur weil ich das selber mal wieder nachschauen wollte 
vielleicht auch nur hello eintragen oder /hello oder ähnliches,
muss alles in 500seitigen Lehrbüchern oder guten Tutorials als Beispiele stehen, sonst wäre es ja eh ein Gefrickel


----------



## Kenan89 (10. Mai 2012)

Danke für das Beispiel, und ich hätte gleich eine Frage. Was
genau ist denn die Möglichkeit dass die Sessions geklaut
werden können? 
Habe gehört, man kann das vermeiden, indem man eine
neue Session definiert, aber wenn man eine neue definiert,
heisst das nicht, dass das Session von einer, z.B. Anmeldung,
nicht mehr beachtet wird, da es ja jetzt eine neue Session
gibt. Das widerrum würde bedeuten, der User ist nicht mehr
angemeldet und müsste seine Eingabedaten neu eintragen.


----------



## SlaterB (10. Mai 2012)

welche Art von Klauen du meinst wäre bei genauerem Focus auch meine Frage,
mit einfachen JSPs, Servlets usw. hier fällt mir wirklich nur ein dass dazu gar nichts zu sagen ist,
jedenfalls nichts zum Webserver selber,

man kann vielleicht den Cookie von einem anderen Rechner kopieren falls nicht auch die IP eine Rolle ist,
und die nicht vielleicht auch vorgetäuscht wird usw.

-----

'nicht mehr angemeldet sein' ist schon ein etwas alltäglicheres Phänomen,
Sessions werden nach 15 Min. oder so beendet, je nach Einstellungen,
das von dir genannte invalidate() bzw. jede sonstiger fachlicher Eingriff in die Daten kann einen Login leicht kaputt machen

inwiefern das gegen ungewissen Klau hilft? 
hmm, reichlich unsichere Diskussion gerade, da weiß ich vorerst nichts zu sagen


----------

