2013-08-14 26 views
10

Obecnie piszę trochę dynamiczną aplikację internetową w Javie. Aplikacja ma być platformą zdarzeń, w której można utworzyć konto użytkownika, zalogować się, a następnie można zobaczyć wszystkie otwarte zdarzenia (w późniejszej iteracji użytkownicy mogą tworzyć/uczestniczyć w tych zdarzeniach).Jak mogę obsługiwać/ograniczać dostęp użytkowników do serwletów i jsp?

Teraz struktura aplikacji internetowej może być (uproszczony) opisał tak:

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

Więc teraz, użytkownik może przejść do login.jsp, jego login-informacja zostanie wysłana do Serwletu logowania, który ją zatwierdził, a następnie wysłał do Serwletu strony głównej. Następnie strona główna serwletu (po ponownym sprawdzeniu poprawności logowania) pobiera wszystkie bieżące zdarzenia z bazy danych, dołącza je do żądania i przekazuje dalej do pliku Main.jsp, który wyświetla go użytkownikowi.

Teraz, jeśli użytkownik chce uzyskać bezpośredni dostęp do pliku Main.jsp (bez przechodzenia z głównej strony serwletu), oczywiście nie może wyświetlić dostępnych zdarzeń. Obejście, z którego korzystam obecnie, wykonuje kontrolę zerową, aby sprawdzić, czy zdarzenia są dostępne, a jeśli nie, przekierować do strony głównej serwletu.

To przeszkadza mi rozwiązać mój problem w ten sposób, ponieważ uważam, że nie jest to najlepsza praktyka i myślę, że po prostu stworzy wiele innych problemów, im większy otrzyma moja aplikacja.

Moja pierwsza myśl o tym, że może być przydatna, gdybym po prostu "ukryła" wszystkie .jsp od użytkownika, więc użytkownik wylądowałby tylko na serwletach i nie mógł uzyskać dostępu do .jsp w inny sposób .

Czy jest jakiś sposób na zrobienie tego? A jeśli nie, jakie byłoby najlepsze rozwiązanie, gdybym pisał profesjonalną aplikację na poziomie przedsiębiorstwa?

+0

Sprawdź autoryzację i autoryzację. W przypadku serwletów są one zwykle implementowane z i wokół 'HttpSession'. –

Odpowiedz

9

Można to obsłużyć w postaci Filter, a w StackOverflow Servlet-Filter wiki można znaleźć wspaniałe wyjaśnienie i przykład.

Przystosowanie kodu tam problemu (uwaga na dodawanie i wykorzystanie metody needsAuthentication):

@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; 
    } 
} 

Polecam przenieść wszystkie strony, które wymagają uwierzytelniania w folderze jak app a następnie zmienić Web filter do

@WebFilter("/app/*") 

W ten sposób można usunąćmetoda z filtra needsAuthentication.

+0

wow, dziękuję. Przypuszczam, że pytanie jest przez to rozwiązane, chociaż zajmie mi to trochę czasu, aby przez to wszystko pracować :) – MrTrustworthy

+0

@MrTrustworthy nie ma za co. Aby dodać, jeśli nie używasz serwera aplikacji zgodnego z Servlet 3.0, takiego jak Tomcat 5, musisz skonfigurować filtr w starym stylu w pliku web.xml. Zauważ, że jest to opisane w opublikowanym przeze mnie linku wiki. –

+0

+1, @MrTrustworthy Jeśli chcesz skonfigurować go ręcznie w web.xml, to znaczy Jeśli używasz serwletów <3.0, istnieje przykład, który został przeze mnie połączony w moim poście. Sugeruję abyś zobaczył ten link raz i Przenieś do wersji 3.0 to najnowsza wersja. –