2013-08-14 79 views
10

Tôi hiện đang viết một ứng dụng web động nhỏ trong Java. Ứng dụng được coi là nền tảng sự kiện nơi bạn có thể tạo tài khoản người dùng, đăng nhập và sau đó bạn có thể xem tất cả các sự kiện mở (trong lần lặp lại sau, người dùng có thể tạo/tham gia vào các sự kiện đó).Làm cách nào để xử lý/hạn chế quyền truy cập của người dùng vào servlets & jsp's?

Ngay bây giờ, cấu trúc của các ứng dụng web có thể được (giản thể) được mô tả như thế này:

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

Vì vậy, ngay bây giờ, người dùng có thể đi đến login.jsp, đăng nhập-thông tin của ông sẽ được gửi vào Login-Servlet, nó sẽ xác thực nó và sau đó gửi nó đến Main-Page-Servlet. Main-Page-Servlet sau đó (sau khi xác thực đăng nhập lại) nhận tất cả các sự kiện hiện tại từ một cơ sở dữ liệu, đính kèm nó vào yêu cầu và chuyển nó đến Main.jsp, hiển thị nó cho người dùng xem.

Bây giờ, nếu người dùng muốn truy cập trực tiếp Main.jsp (không đến từ Trang chính-Servlet), rõ ràng là không thể hiển thị các sự kiện có sẵn. Cách giải quyết mà tôi đang sử dụng hiện đang thực hiện kiểm tra null để xem các sự kiện có ở đó không, và nếu không, hãy chuyển hướng đến Main-Page-Servlet.

Nó làm phiền tôi giải quyết vấn đề của tôi như vậy, vì tôi không nghĩ đó là thực hành tốt nhất và tôi nghĩ nó sẽ tạo ra nhiều vấn đề khác mà ứng dụng của tôi càng lớn. Ý tưởng đầu tiên của tôi về điều này là, nó có thể hữu ích nếu tôi chỉ có thể "ẩn" tất cả .jsp từ người dùng, vì vậy người dùng sẽ chỉ truy cập vào servlet và không thể truy cập vào tệp .jsp theo cách khác .

Có cách nào để làm điều đó không? Hoặc, nếu không, giải pháp thực hành tốt nhất là gì nếu tôi viết một ứng dụng cấp doanh nghiệp chuyên nghiệp?

+0

Xem xét xác thực và ủy quyền. Với các servlet, chúng thường được thực hiện với và xung quanh 'HttpSession'. –

Trả lời

9

Điều này có thể được xử lý trong Filter và có giải thích và ví dụ tuyệt vời trong StackOverflow Servlet-Filter wiki.

Thích ứng với các mã có cho vấn đề của bạn (lưu ý việc bổ sung và sử dụng các phương pháp 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; 
    } 
} 

Tôi muốn giới thiệu để di chuyển tất cả các trang yêu cầu xác thực bên trong một thư mục như app và sau đó thay đổi web bộ lọc để

@WebFilter("/app/*") 

Bằng cách này, bạn có thể loại bỏ phương pháp needsAuthentication từ bộ lọc.

+0

wow, cảm ơn bạn. tôi cho rằng câu hỏi được giải quyết bằng cách đó, mặc dù nó sẽ đưa tôi một thời gian để làm việc thông qua tất cả điều đó :) – MrTrustworthy

+0

@MrTrustworthy bạn được chào đón. Chỉ cần thêm, nếu bạn không sử dụng máy chủ ứng dụng tương thích Servlet 3.0 như Tomcat 5 thì bạn phải cấu hình bộ lọc theo cách cũ trong tệp web.xml. Lưu ý rằng điều này được đề cập trong liên kết wiki mà tôi đã đăng. –

+0

+1, @MrTrustworthy Nếu bạn muốn cấu hình nó trong web.xml theo cách thủ công, đó là Nếu bạn đang sử dụng servlets <3.0 thì có một ví dụ tôi đã liên kết trong bài đăng của tôi. Tôi khuyên bạn nên xem liên kết đó một lần và Di chuyển tới 3.0 vì nó là phiên bản mới nhất. –

Các vấn đề liên quan