J2EE Security - A JSF based Login Form

  • Themenstarter Themenstarter KlausDieter
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
K

KlausDieter

Gast
Hi
ich benutze zum Login für meine Webanwendung einen Tomcat Realm, allerdings bringt das einige unschöne Probleme mit sich. Zunächst einmal ist es scheinbar nicht möglich j_security_check aus einem JSF formular aus aufzurufen, sondern nur aus einem HTML formular. Daher ist es auch nicht möglich Validatoren oder ähnliches auf die Benutzername- und Passwortfelder aufzurufen.

Im folgenden Blog habe ich einen recht guten Workaround für dieses Problem gefunden, allerdings funktioniert er bei mir nicht so wie im Blog beschrieben.
http://groundside.com/blog/DuncanMills.php?s=f:verbatim&submit.x=8&submit.y=8
Ich hoffe es kann mir jemand sagen, was ich falsch mache.

Nach Klicken des Logon Buttons erscheint folgende Exception:

javax.servlet.ServletException: Cannot forward after response has been committed
javax.faces.webapp.FacesServlet.service(FacesServlet.java:154)

Meine Loginseite:
Code:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<html>
<head>
<title>login</title>
</head>
<body>
<f:view>
<h:form>
Please log on.
<h:inputText id="j_username" value="#{loginhandler.name}" />
<h:inputSecret id="j_password" value="#{loginhandler.password}" />
<h:commandButton value="Logon" action="#{loginhandler.loginAction}" />
</h:form>
</f:view>
</body>
</html>
</body>
</html>
Meine loginproxy.jsp
Code:
<html>
<body onload="document.forms[0].submit()" >
<form method="post" action="j_security_check"><input
  type="hidden" name="j_username" value="${j_username}" /> <input
  type="hidden" name="j_password" value="${j_password}" /></form>
</body>
</html>
und schließlich der Loginhandler:
Code:
package de.pf.MOVEXProducts;

import java.io.IOException;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginHandler {
  private String name;
  private String password;


  public String loginAction() throws IOException, ServletException {
    
    ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
    HttpServletRequest request = (HttpServletRequest)ectx.getRequest();
    HttpServletResponse response = (HttpServletResponse)ectx.getResponse();
    request.getRequestDispatcher("/loginproxy.jsp").forward(request,response);

    return null;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

}
 
xgqmao zgymp hrtdvufaj dutoz fnwgoz mledckiy ylbts
 
Deine loginproxy.jsp sollte so aussehen:

Java:
<html>
<body onload="document.forms[0].submit()" >
<form method="post" action="j_security_check"><input
  type="hidden" name="j_username" value="#{loginhandler.password}" /> <input
  type="hidden" name="j_password" value="#{loginhandler.loginAction}" /></form>
</body>
</html>

Probier mal..
 
Ob ihn deine Nachricht im Jahre 2008 noch erreichen wird??

Konterkariert ein Moderator etwa die Forensuche? Ist doch egal, ob der ursprüngliche Poster das noch benötigt oder nicht... es gibt evtl. eine Antwort auf eine Frage im Forum, die ein halbwegs intelligenter Forenuser über die Forensuche finden kann. Wenn es gut geht, macht einer von hundert Java-Forum Usern keinen neuen Thread dafür auf...
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben