2017-07-25 5 views
0

Ich habe eine einfache Implementierung von Login-Filter.Login Filter Java Servlet

public class LoginFilter implements Filter { 

     @Override 
     public void init(FilterConfig filterConfig) throws ServletException {} 

     @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); 
      if (session == null || session.getAttribute("loggedInUser") == null) { 
       response.sendRedirect(request.getContextPath() + "/login.jsp"); 
      } else { 
       chain.doFilter(request, response); 
      } 
     } 

     @Override 
     public void destroy() {} 

    } 

Wenn ich zu jedem registrierten Seite gehen (d. /account?id=1) ohne Session-Attribut loggedInUser, Filter funktionieren gut. Es leitet mich zur Anmeldeseite um. Aber wenn ich auf nicht existierende Seite gehe (d. H. /blablabla.html), leitet der Filter mich erneut zur Anmeldeseite um. Gibt es eine Methode, um 404 Fehler bei der Eingabe nicht existierender Seiten zu erhalten und umleiten an /login on exists?

Antwort

2

Der Fehler ist in der Anforderung: Sie filtern alle Anfragen zu verweigern den Zugriff auf Gäste, aber immer noch die Anfrage verarbeitet werden soll, wenn es ein 404 ist. Das wäre konzeptionell falsch: Ein 404 ist immer noch eine anwendbare Antwort in dem Sinne es gibt dem Benutzer einen Überblick über die Interna des Systems - so muss der Benutzer autorisiert werden, bevor er weiß, dass etwas da ist oder nicht.

  • /public/style.css
  • /public/app.js
  • ...
  • /private/customer/123
  • /private/oder/8932
  • ...
  • :

    Eine weitere Möglichkeit, Ihre App in einem öffentlichen und einem privaten Zone spaltet

und nur Anfragen in der privaten Zone filtern.

Hinweis: Wenn Sie sich Sorgen um die Schönheit der URL machen, beachten Sie, dass das /private/ Präfix keine Voraussetzung ist. Der Filter kann so angeschlossen werden, dass ein beliebiges Präfix weggelassen werden kann.

0

Denken Sie daran, dass die Filter vorhanden sind, um eingehende Anfragen oder ausgehende Antworten zu filtern, also ist der Ablauf in etwa so.

Client -----> Anfrage ----> Filter ----> Servlet Dispather ----> Ressourcen

So, jetzt, leider wird die Anfrage durch den Filter ganz gleich abgefangen werden Die Ressource existiert oder nicht und dies geschieht, bevor das Servlet Dispatherer die Anfrage bekommen kann und erkennt, dass die Ressource nicht existiert.

Ich hoffe, diese Erklärung kann Ihre Frage beantworten.

Danke.