# JSP Weiterleitung



## flori (19. Aug 2012)

Hallo,

ich habe ein Problem mit einer JSP Seite.

Und zwar wenn ich auf meiner Page durchnavigiere will ich zu einer Anmeldemaske gelangen, wo sich jeder User anmelden soll.
Mein Problem ist, dass wenn man die Url direkt im Browser wählt man diese Prüfung einfach umgehen kann. 

Ich hatte eigetnlich vor das ganze über einen JSP zu lösen:

[JAVA=42]
<%
	HttpSession s = request.getSession();
	if ((String) session.getAttribute("name")==null) {

		response.sendRedirect("Anmeldung.html");

	}
%>
[/code]


und das setzen der Anmeldung sollte folgendermaßen Funktionieren:
[JAVA=42]
		if (checkUser(userName, password)){
			HttpSession session = request.getSession(); 
			String sessionid = generateSessionId();
			session.setAttribute("name", userName);
			Cookie cookie = new Cookie ("sessionid", sessionid);
			response.addCookie(cookie);
			session.setAttribute("sessionid", cookie);
			session.setAttribute("userName", userName);
			out.println("immerhin bis hierhin geschafft");
			response.sendRedirect("MeinTomorrowland.jsp");
		}
		else {
			response.sendRedirect("AnmeldungFehlgeschlagen.html");

		}
[/code]

Leider funktioniert das nicht und man gelangt einfach immer auf die Seite auch ohne Anmeldung.

Habt ihr eine Idee, was ich falsch gemacht habe?

Vielen Dank schonmal im voraus.

Mit freundliche Grüßen

Florian


----------



## SlaterB (19. Aug 2012)

direkt weiß ich nicht weiter,
aber JSP-Direktzugriff umständlich abzufangen ist eh keine Lösung,
kontrolliere mit web-xml, welche Zugriffe erlaubt sind, ALLE (erlaubten) müssen auf ein Servlet gehen, 
und sei es ein allgemeines, welches aus dem URL-String quasi gleich zur JSP weiterleitet, 
vor diesem 'quasi' kann aber im Servlet dann nun wirklich noch Code stehen wie Login usw.,

freilich kann das genauso nicht funktionieren, dann ist Logging angesagt usw., Fehler untersuchen, ginge im JSP auch irgendwie, aber schlecht, JSP ist Darstellung, Java-Code gehört in Servlets!


----------



## flori (20. Aug 2012)

Vielen Dank für die schnelle Antwort, habe den Login via Servlet gemacht und es hat funktioniert.

Vielen Dank


----------



## nillehammer (20. Aug 2012)

Authentication solltest Du nicht selbst machen. Sicherer ist es, das in der web.xml zu konfigurieren. Hier gibt es eine vollständig Kommentierte web.xml: web.xml Reference Guide for Tomcat - Metawerx Java Wiki Gehe in die Zeile " <!-- Security -->" In den nachfolgenden Zeilen siehst Du was alles an Elementen benötigt wird.

P.S. Ach ja, und den direkten Zugriff auf JSPs verhindert man am zuverlässigsten, indem man sie unterhalb von WEB-INF packt. Es gibt viele gute Gründe, das zu tun... Abgesehen von ein paar Ausnahmen würde ich alle JSPs dort hin legen.


----------



## flori (21. Aug 2012)

Hallo ich bins nochmal, 

habe versucht die web.xml nach den voraussetzungen zu erstellen. Sie sieht bei mir dann folgendermaßen aus:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>LoginExample</display-name>
  <servlet>
  <servlet-name>RegistrierungServlet</servlet-name>
  <servlet-class>RegistrierungServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>RegistrierungServlet</servlet-name>
  	<url-pattern>/RegistrierungsServlet</url-pattern>
  </servlet-mapping>
   <servlet>
  <servlet-name>BuchungServlet</servlet-name>
  <servlet-class>RegistrierungServlet</servlet-class>
  </servlet>
    <servlet-mapping>
  	<servlet-name>BuchungServlet</servlet-name>
  	<url-pattern>/BuchungServlet</url-pattern>
  </servlet-mapping>
   <servlet>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>RegistrierungServlet</servlet-class>
  </servlet>
    <servlet-mapping>
  	<servlet-name>LoginServlet</servlet-name>
  	<url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
</web-app>

Diesen habe ich im WEB-INF Ordner gespeichert.

Die Ordnerstruktur: C:\xampp\tomcat\webapps\Homepage für die .html und .jsp dateien
C:\xampp\tomcat\webapps\Homepage\WEB-INF für die web.xml
und C:\xampp\tomcat\webapps\Homepage\WEB-INF\classes für die Java Klassen und Quellcode

Leider kommt immernoch die gleiche Fehlermeldung. Habe ich dabei jetzt wieder etwas falsch gemacht?


----------



## nillehammer (21. Aug 2012)

- Du musst bei <servlet-class> den voll qualifizierten Namen Deiner Servletklasse angeben
- Du gibst bei allen Mappings immer wieder die selbe Klasse "RegistrierungServlet" an, Absicht oder Copy-Paste Fehler?
- Bei den url-patterns würde ich das "Servlet" am Ende weglassen. URLs à la "/login", "/registrierung", "/buchung" sehen eindeutig netter aus als "/BuchungServlet"


----------



## flori (21. Aug 2012)

Danke für den Tipp mit den Patterns

Der Fehler bei Mappings war wirklich Copy Paste bedingt, danke erstmal dafür. Habe es geändert aber leider funktioniert es immernoch nicht. 
Was heißt voll qualifizierter Name?

Ich verstehe irgendwie nicht, warum das ganze unter eclipse laufen kann und dann bei export ->  war auf einmal nicht mehr.

macht es einen unterschied, wenn im eclipse das ganze mapping über 
@WebServlet(urlPatterns = { "/LoginServlet" } 

also über import javax.servlet.annotation.WebServlet. Müsste ich dieses Mapping Tag rausnehmen, wenn ich dann bei xampp mit der web.xml arbeite?

Oder ist es möglich, dass mein Tomcat eine falsche Konfiguration hat?

Vielen Dank nochmals


----------



## nillehammer (22. Aug 2012)

> Was heißt voll qualifizierter Name?


Das ist ein voll qualifizierter Name (inkl. packages!):

```
javax.servlet.annotation.WebServlet
```

Das ist *kein* voll qualifizierter Name (Oder entwickelst Du alles im default-Package?):

```
RegistrierungServlet
```


----------

