JSF JSF Redirect zu Requested URL nach Login

Marc T.

Bekanntes Mitglied
Hallo Leute,

ich arbeite derzeit an einem kleinen Problem. Ich habe einen Login implementiert
mit Hilfe eines Loginfilters. Um das ganze zu testen habe ich natürlich auch eine
kleine private XHTML-Seite, die unter

Code:
private/text.xhtml

gespeichert ist.

Wenn jetzt ein User, der nicht eingeloggt ist, auf die test.xhtml zugreifen möchte,
wird er zur Login-Seite umgeleitet. Ich möchte nun aber die ursprünglich angeforderte
URL, also zur test.xhtml, speichern, damit ich den User nach erfolgreichem Login dahin
umleiten kann.

Hier mal mein Loginfilter, in dem ich versuche, die angeforderte URL als Session-Attribut
zu speichern:

Java:
@WebFilter("/private/*")
public class LoginFilter implements Filter {
	@Inject
	private NavigationService navigationService = null;
	
	@Override
	public void init(FilterConfig config) throws ServletException {}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		
		String from = req.getRequestURI();
		
		if(req.getQueryString() != null) {
			from += "?" + req.getQueryString();
		}
		
		User user = (User) req.getSession().getAttribute("user");
		
		if(user != null) {
			chain.doFilter(request, response);
		} else {
			req.getSession().setAttribute("from", from);
			
			res.sendRedirect(req.getContextPath() + navigationService.toLogin());
		}
	}
	
	@Override
	public void destroy() {}
}

Mein LoginService der aufgerufen wird, nachdem man auf den Login-Button geklickt
hat, sieht folgendermaßen aus:

Java:
@Named
@SessionScoped
public class LoginService implements Serializable {
	private String username = "";
	private String password = "";
	@Inject
	private NavigationService navigationService = null;
	@Inject
	private DAO dao = null;
	
	public void doLogin() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
		FacesContext context = FacesContext.getCurrentInstance();
		ExternalContext externalContext = context.getExternalContext();

		User user = null;
		boolean validated = false;
		String from = "";
		
		if(this.username != null && !this.username.trim().isEmpty()) {
			user = dao.findUserByUsername(this.username);
			
			if(this.password != null && !this.password.trim().isEmpty()) {
				validated = PasswordHasher.validatePassword(this.password, user.getPassword());
			}
		}
		
		if(externalContext.getRequestMap().containsKey("from")) {
			from = (String)externalContext.getRequestMap().get("from");
		} else {
			from = navigationService.externalContextRedirectToIndex();
		}
			
		if(user != null && validated) {
			externalContext.getSessionMap().put("user", user);
			externalContext.redirect(from);
		} else {
			context.addMessage(null, new FacesMessage("False username or password!"));
		}
	}
	
	public void doLogout() throws IOException {
		ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
		
		externalContext.invalidateSession();
		externalContext.redirect(externalContext.getRequestContextPath() + navigationService.toLogin());
	}
	
	// Getter and Setter

Nun ist es aber so, dass das ganze entweder nicht in der Session landet oder aber
sonst was passiert denn in der SessionMap befindet sich leider nie "from".

Könnte mir einer dabei helfen?

Ich möchte wie gesagt, dass der User nach erfolgreichem Login zur ursprünglich
angeforderten Seite umgeleitet wird.
 

Marc T.

Bekanntes Mitglied
SessionScoped

Ich denke aber das der nicht viel zur Sache tut, denn der sammelt nur Addressen:

Java:
@Named
@SessionScoped
public class NavigationService implements Serializable {
	
	public String toIndex() {
		return "/index.html";
	}
	
	public String redirectToIndex() {
		return "/index.html?faces-redirect=true";
	}

	public String externalContextToIndex() {
		return "/Web-Tschuwwa/index.html";
	}
	
	public String externalContextRedirectToIndex() {
		return "/Web-Tschuwwa/index.html?faces-redirect=true";
	}
	
	public String toLogin() {
		return "/login/login.html";
	}

	public String redirectToLogin() {
		return "/login/login.html?faces-redirect=true";
	}
	
	public String toRegister() {
		return "/login/register.html";
	}
	
	public String redirectToRegister() {
		return "/login/register.html?faces-redirect=true";
	}
}

Warum ich hier zwei verschiedene links verwende, also einmal mit Web-Tschuwwa und einmal
ohne? Web-Tschuwwa ist mein Projektname und ich habe festgestellt, dass wenn ich über
einen externalContext redirecte und dabei meinem Projektnamen nicht mit angebe, ich
zur index.html von meinem Glassfish Server redirected. Warum weiß ich nicht.
 
Zuletzt bearbeitet:

eso

Mitglied
In dem Filter speicherst du das "from" in der Session und in dem LoginService versuchst es aus dem ExternalContext aus zu lesen. Vielleicht ist das das Problem. Versuche mal im Filter auch mit dem ExternalContext zu arbeiten.

EDIT: Außerdem ist es üblich, dass die Request-URL als GET-Parameter an die Login-URL übergeben wird
 
Zuletzt bearbeitet:

Marc T.

Bekanntes Mitglied
Schon probiert, funktioniert leider nicht, weil der ExternalContext im Filter immer null ist.

Aus dem LoginService hole ich mir aus dem ExternalContext ja die RequestMap, in die
ich ja hier:

Java:
req.getSession().setAttribute("from", from);

Das "from" hinzugefügt habe.
 

Marc T.

Bekanntes Mitglied
Oh ich danke dir!

Java:
if(externalContext.getSessionMap().containsKey("from")) {
	from = (String)externalContext.getSessionMap().get("from");
} else {
	from = navigationService.externalContextRedirectToIndex();
}

schon klappts!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
pkm Gibt es einen Redirect von der Tomcatstartseite auf ein Projekt? Allgemeines EE 4
S Play Framework: Redirect im Routing auf Scala Seite Allgemeines EE 0
W redirect in neuem Fenster? Allgemeines EE 8
K Servlet: Respone.redirect mit POST-Parametern Allgemeines EE 5
F Fehlermeldung beim redirect in der JSP Allgemeines EE 4
mor16Euro Servlet Fehler code: The requested resource is not available Allgemeines EE 7
MiHimbert Wildfly Access Denied nach Delete und erneutes Schreiben Allgemeines EE 1
J JSTree in Web-App: Datenbank-Beziehungen verschwinden nach unbestimmter Zeit Allgemeines EE 4
J Missing MessageBodyWriter nach Guice-Anbindung Allgemeines EE 0
D Websocket nach Decoder Annotation nicht mehr erreichbar Allgemeines EE 0
J Mit @Schedule annotierte Methode wird nach einer Weile nicht mehr ausgeführt (JBoss AS 7.2) Allgemeines EE 0
OnDemand Methodenaufruf nach Aufgabenabschluss in Asynch-Methode Allgemeines EE 4
E Wie kann ich über einen Suchfeld in Java Server Pages nach Datenbankinhalten suchen? Allgemeines EE 11
I JBoss unheimlich langsam nach mehreren Deploys Allgemeines EE 2
L JSF f:param konvertiert 'blank' nach '+' in mailto-link Allgemeines EE 13
Y JSF Komische Fehlermeldung nach Deployment und Serverstart Allgemeines EE 5
N Tomcat funktioniert nach shutdown/startup nicht mehr korrekt Allgemeines EE 9
JimPanse Tomcat Fehler nach redeploy Allgemeines EE 5
R Je nach Benutzer anderes Datenbank-Schema auswählen Allgemeines EE 4
C WebStart Fehler nach update auf Java 1.6 Allgemeines EE 2
MQue TCP- Verbindung nach Tomcat- Start (global) starten Allgemeines EE 4
MQue RequestDispatcher nach Submit Allgemeines EE 2
A Timeout nach 30 Minuten Laufzeit einer entfernten Methode Allgemeines EE 3
V JSP BEAN Speichern von einer Zahl nach eingabe Allgemeines EE 2
G Von Java SE nach JavaEE umsteigen Allgemeines EE 31
G Probleme mit dem Klassenpfad nach dem deployment Allgemeines EE 2
F MySQL Connection Pool nach Apache Example Allgemeines EE 1
R auf der Suche nach dem Fehler,Sessions + Arrays Allgemeines EE 4
B JSF - Form. je nach checked Radio um Feld erweitern Allgemeines EE 3
G Wie Objekte von JSP nach Servlet? Allgemeines EE 4
C JSF: request nach ausführung killen? Allgemeines EE 7
B Auf Win Rechner bauen und nach Debian Tomcat deployen Allgemeines EE 4
M Tomcat automatisch neustarten nach crash Allgemeines EE 2
D action url nach der umleitung finden Allgemeines EE 21
W Session nach Browserschließung erhalten im Tomcat Allgemeines EE 4
G Strutsanwendung auf Tomcat nach Neustart langsamer. Allgemeines EE 4
A Leerzeilen in HTML-Seite, nach Erzeugen des Servlets Allgemeines EE 3

Ähnliche Java Themen

Neue Themen


Oben