2013-08-14 4 views
10

Ich schreibe gerade eine kleine dynamische Web-Anwendung in Java. Die Anwendung soll eine Ereignisplattform sein, auf der Sie ein Benutzerkonto erstellen, sich anmelden und dann alle offenen Ereignisse sehen können (in einer späteren Iteration können Benutzer diese Ereignisse erstellen/daran teilnehmen).Wie kann ich den Benutzerzugriff auf Servlets & Jsp's behandeln/einschränken?

Im Moment ist die Struktur des Web-App könnte (vereinfacht) wie folgt beschrieben:

Register-Servlet -> Register.jsp 
     | 
     V 
Login-Servlet -> Login.jsp 
     | 
     V 
Main-page-Servlet -> Main.jsp 

So jetzt ein Benutzer auf Login.jsp, seine Login-Informationen würden gesendet gehen könnte zum Login-Servlet, das es validieren und dann an das Main-Page-Servlet senden würde. Das Main-Page-Servlet ruft dann (nach einer erneuten Validierung der Anmeldung) alle aktuellen Ereignisse aus einer Datenbank ab, hängt sie an die Anfrage an und leitet sie an die Datei Main.jsp weiter, die sie für den Benutzer anzeigt.

Wenn nun ein Benutzer direkt auf Main.jsp zugreifen möchte (ohne vom Main-Page-Servlet zu kommen), kann er natürlich die verfügbaren Ereignisse nicht anzeigen. Die Problemumgehung, die ich momentan verwende, ist eine Null-Überprüfung, um zu sehen, ob die Ereignisse dort sind, und wenn nicht, umleitung zum Main-Page-Servlet.

Es stört mich, mein Problem so zu lösen, da ich nicht denke, dass das die beste Praxis ist und ich denke, es wird nur eine Menge anderer Probleme schaffen, je größer meine Anwendung wird.

Mein erster Gedanke war, dass es nützlich wäre, wenn ich einfach alle .jsps vom Benutzer "verstecken" könnte, so dass der Benutzer nur auf Servlets landet und nicht auf die .jsps zugreifen kann .

Gibt es eine Möglichkeit, das zu tun? Oder, wenn nicht, was wäre die Best-Practice-Lösung, wenn ich eine professionelle Anwendung auf Unternehmensebene schreiben würde?

+0

Siehe Authentifizierung und Autorisierung. Bei Servlets werden diese typischerweise mit und um die 'HttpSession' herum implementiert. –

Antwort

9

Dies kann in einem Filter behandelt werden und es gibt große Erklärung und Beispiel in StackOverflow Servlet-Filter wiki.

Anpassung des Code dort für Ihr Problem (man beachte die Zugabe und Verwendung der needsAuthentication-Methode):

@WebFilter("/*") 
public class LoginFilter implements Filter { 
    @Override 
    public void init(FilterConfig config) 
     throws ServletException { 
     // If you have any <init-param> in web.xml, then you could get them 
     // here by config.getInitParameter("name") and assign it as field. 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
     throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     HttpSession session = request.getSession(false); 

     String requestPath = httpServletRequest.getRequestURI(); 

     if (needsAuthentication(requestPath) || 
      session == null || 
      session.getAttribute("user") == null) { // change "user" for the session attribute you have defined 

      response.sendRedirect(request.getContextPath() + "/login"); // No logged-in user found, so redirect to login page. 
     } else { 
      chain.doFilter(req, res); // Logged-in user found, so just continue request. 
     } 
    } 

    @Override 
    public void destroy() { 
     // If you have assigned any expensive resources as field of 
     // this Filter class, then you could clean/close them here. 
    } 

    //basic validation of pages that do not require authentication 
    private boolean needsAuthentication(String url) { 
     String[] validNonAuthenticationUrls = 
      { "Login.jsp", "Register.jsp" }; 
     for(String validUrl : validNonAuthenticationUrls) { 
      if (url.endsWith(validUrl)) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

ich empfehlen würde alle Seiten zu bewegen, die Authentifizierung wie app in einem Ordner benötigt und dann die Änderung Web-Filter zu

@WebFilter("/app/*") 

auf diese Weise können Sie entfernen die needsAuthentication Methode aus dem Filter.

+0

wow, danke. Ich nehme an, dass die Frage dadurch gelöst wird, obwohl es mich eine Weile dauern wird, um durch all das zu arbeiten :) – MrTrustworthy

+0

@MrTrustworthy Sie sind willkommen. Wenn Sie keinen Servlet 3.0-kompatiblen Anwendungsserver wie Tomcat 5 verwenden, müssen Sie den Filter auf die alte Weise in der Datei web.xml konfigurieren. Beachten Sie, dass dies in dem von mir geposteten Wiki-Link beschrieben wird. –

+0

+1, @MrTrustworthy Wenn Sie es manuell in web.xml konfigurieren möchten, ist das Wenn Sie Servlets <3.0 verwenden, gibt es ein Beispiel, das ich in meinem Post verknüpfte. Ich schlage vor, dass Sie den Link einmal sehen und zu 3.0 als es verschieben ist die neueste Version. –

Verwandte Themen