# JSF - java File Verständnisfrage



## OnDemand (21. Feb 2015)

Moin!

Irgendwie hab ich ein riesen Fragezeichen überm Kopf, vielleicht kann mir jemand helfen.

Ich habe eine xhtml-JSF Seite (index.xhtml) und dazu eine .java Class (User.java), welche auf ein Buttonklick reagiert und eine Ausgabe auf Konsole erzeugt. 

Wenn ich nun das Ganze deploye, öffnet sich localhost:8080/app/index.xhtml

Wozu habe ich dann aber beim Anlegen des Servlet (User.java)das URL-Pattern "/user" angelegt? Rufe ich im Browser localhost:8080/app/user auf, kommt ne weiße Seite. 

Schmeiße ich hier 2 Dinge durcheinander oder muss ich die JSF seite noch irgendwie mit der Java-Datei verbinden?


----------



## FINF_AW_Alex (23. Feb 2015)

Moin  kannst du mal deine index und user datei posten?

grüße Alex


----------



## OnDemand (23. Feb 2015)

Klaro, ist aber nur ein Test, daher der  sinnlose Methodenname 

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.org/ui">
<h:head>
	<link rel="shortcut icon" type="image/x-icon" href="#{resource['favicon.ico']}" />
</h:head>

<h:body>
	<ui:include src="/resources/template/header_without_menu.xhtml" />

	<h:form class="contentBackground">
		<p:outputPanel deferred="false">
			<ui:include src="/news/news.xhtml"></ui:include>
		</p:outputPanel>
	</h:form>
	<h:form>
		<p:commandButton id="login" value="Los geht's!"
			action="#{loginController.mache}"/>
	
	</h:form>


	<ui:include src="/resources/template/footer.xhtml"></ui:include>
</h:body>
</html>
```

User:

```
import javax.faces.bean.ManagedBean;
import javax.servlet.http.HttpServlet;

@ManagedBean
public class LoginController extends HttpServlet {

	private static final long serialVersionUID = -1978333930019186692L;

	public String mache() {
		return "success";
	}

	}
```

Das mit der Domainendung ist mir jetzt eigentlich nicht so wichtig. Die Frage hat einen anderen Hintergrund wo ich dachte durch eine Antwort komme ich auf die Lösung. Ich möchte nämlich verhindern, dass ein User einfach die Domain Domain.de - Seite nicht gefunden eingibt ohne sich eingelogged zu haben.

Wie ist denn hier die beste vorgehendweise? Sessions, cookies?


----------



## stg (23. Feb 2015)

Die "beste" Vorgehensweise gibt es nicht. 
Für kleine Anwendungen reicht es mitunter aus im SessionScope irgendwo einen Merker zu setzen, ob ein user eine Seite sehen darf oder nicht, bzw einfach per rendered-Attribut die nicht erlaubten Inhalte schlicht nicht zu rendern.
Eine eingeschränkte Sicht auf ganze Sub-domains kannst du auch leicht mittels eines Listeners auf der Restore-View realisieren. Sofern es einen wie auch immer gearteten Dienst für Authorisierung und Authenfikation gibt, kann man oft auch völlig transparent den Application Server das ganze Sicherheitsgedöns verwalten lassen. Cookies oder anderer Client-seitiger Krams sollte bei sicherheitsrelevanten Aspekten aber immer nur _zusätzlich_ (wenn überhaupt) Verwendung finden. Gründe sollten auf der Hand liegen... Vorteile, die zusätzliche Client-seitige Bestandteile deiner Anwendung liefern könnten, sind erst einmal nicht sonderlich von Interesse. 

Deine ursprüngliche Frage ist so konfus und ein heilloses durcheinander. Tu dir selbst den Gefallen und versuche nicht alles auf einmal zu verstehen und/oder umzusetzen. Schnapp dir ein passendes Einsteiger-Tutorial und dann ab dafür... Zu deinem Code weiß ich gar nicht so Recht, was ich sagen soll. Die gleiche Klasse gleichzeitig eine Bean und ein Servlet sein zu lassen, sieht jedenfalls recht...sagen wir.. eigen aus. Zumal du keinerlei HTTP request explizit behandelst. Wozu das ganze dann also?
Die xhtml-Seite sieht normal aus. Hier konnte ich nix Auffälliges entdecken.


----------



## OnDemand (23. Feb 2015)

Hi, danke dir für deine Antwort! Bezgl. der Bean gleichzeitig als Servlet macht wirklich keinen Sinn, muss ein Überrest aus anderen Versuchen sein 

Ich sehe du hast mein Durcheinander erkannt, welches mir durch den Kopf wuselt 

Ich brauch jetzt erstmal einen Denkanstoß, wie ich folgendes Problem löse:

User geht kommt per welcome-page auf eine Seite wo er sich einloggen kann (Seite ok, welcome page in web.xml ok)
Nun hat der User verschiedene Rollen, er kann Modul A und Modul B aufrufen und nutzen. Modul A und B sollen zwei machen irgendwas mit Daten (auch ok, reiner Java-Code).

Die User und deren Modul-Erlaubnisse (Rollen) sind in einer DB persistent.

Wie kann ich nun prüfen, ob der User eingelogged ist? Und wie kann ich es verhindern, dass er die Seite Domain.de - Seite nicht gefunden aufruft ohne eingelogged zu sein? Ich verstehe nicht, wie ich in der XHTML Seite, beim Aufruf prüfen lasse ob er eingelogged ist. Und wo hinterlege ich ein ("true" für eingelogged). Fragen über Fragen, hab schon sämtliche Tutorials gegoogled aber das ist alles mit riesen Frameworks, was ich bisschen überladen finde.


----------



## FINF_AW_Alex (25. Feb 2015)

hey Nico, an so einer Sache arbeite ich auch gerade, das Interface HttpServeletRequest gibt einige Methoden die sehr hilfreich sind, z.B. getRemoteUser() mit der kannst du den aktuell eingeloggten Benutzer ermitteln.

Doku


ein getter für den Benutzernamen sieht bei mir dann so aus:


```
//GETTER für Benutzerinformatinen
    public String getUser() {       
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();      
        user        = request.getRemoteUser();
        return user;
    }
```

man sollte aber wohl noch ein tryCatch um das request basteln bevor man es richtig einsetzt 

greetz Alex


----------

