2013-04-12 37 views
7

Tôi mới làm quen với lập trình web. Tôi yêu cầu một mô hình phổ biến để làm những việc như kiểm tra xác thực. Đây là kịch bản:Cách trang JSP nên kiểm tra xác thực

Trang web có trang đăng nhập cho khách truy cập. Nó sẽ lấy tên người dùng và mật khẩu được mã hóa và gửi chúng đến máy chủ, sau đó nhận được một mã lỗi (tên người dùng/mật khẩu không phù hợp) hoặc một phím auth từ máy chủ. Khi người dùng đăng nhập thành công, tôi muốn trang web tự động chuyển đến trang main.jsp trình bày chức năng chính của trang web.

Trong trường hợp này, tôi muốn main.jsp kiểm tra xác thực người dùng. Đó là, tôi không muốn điều đó xảy ra như người dùng có thể trực tiếp mở www.example.com/main.jsp, và nếu họ đã làm điều như thế này, tôi muốn chuyển hướng họ đến trang đăng nhập.

Vậy làm cách nào tôi có thể chuyển thông tin xác thực trên trang và làm cách nào để ngăn người dùng truy cập trực tiếp vào main.jsp mà không cần đăng nhập? Tôi có cần sử dụng phiên hay bất kỳ thứ gì không?

+3

nếu tôi hiểu bạn một cách chính xác, có vẻ như những gì bạn cần là lọc trên ứng dụng web của bạn ...bạn có thể thử đọc http://docs.oracle.com/javaee/5/api/javax/servlet/Filter.html –

Trả lời

14

bạn có thể thử sử dụng bộ lọc :

Lọc thể trước quá trình một yêu cầu trước khi nó đạt đến một servlet, sau quá trình phản ứng lại một servlet, hoặc làm cả hai. Bộ lọc có thể chặn, kiểm tra và sửa đổi các yêu cầu và phản hồi.

LƯU Ý: hãy chắc chắn để thêm một thuộc tính phiên khi người dùng của bạn được đăng nhập, bạn có thể sử dụng thuộc tính phiên họp về các bộ lọc

trên login.jsp bạn add:

session.setAttribute("LOGIN_USER", user); 
//user entity if you have or user type of your user account... 
//if not set then LOGIN_USER will be null 

web.xml

<filter> 
    <filter-name>SessionCheckFilter</filter-name> 
    <filter-class>yourjavapackage.SessionCheckFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SessionCheckFilter</filter-name> 
    <!--url-pattern>/app/*</url-pattern--> 
    <url-pattern>/main.jsp</url-pattern> <!-- url from where you implement the filtering --> 
</filter-mapping> 

SessionCheckFilter.java

public class SessionCheckFilter implements Filter { 

    private String contextPath; 

    @Override 
    public void init(FilterConfig fc) throws ServletException { 
    contextPath = fc.getServletContext().getContextPath(); 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 

    if (req.getSession().getAttribute("LOGIN_USER") == null) { //checks if there's a LOGIN_USER set in session... 
     res.sendRedirect(contextPath + "/login.jsp"); //or page where you want to redirect 
    } else { 
     String userType = (String) req.getSession().getAttribute("LOGIN_USER"); 
     if (!userType.equals("ADMIN")){ //check if user type is not admin 
     res.sendRedirect(contextPath + "/login.jsp"); //or page where you want to 
     } 
     fc.doFilter(request, response); 
    } 
    } 

    @Override 
    public void destroy() { 
    } 
} 
5

Làm thế nào JSP trang nên kiểm tra xác thực

Nó không nên. Bạn nên sử dụng Xác thực quản lý vùng chứa và xác định thông tin đăng nhập/bảo mật trong web.xml thông qua các mẫu URL.


Được thêm bởi Glen xuất sắc nhất:

Ví dụ: Thêm một cái gì đó như thế này để web.xml:

<security-constraint> 
    <display-name>GET: Employees Only</display-name> 
    <web-resource-collection> 
     <web-resource-name>Restricted Get</web-resource-name> 
     <url-pattern>/restricted/employee/*</url-pattern> 
     <http-method>GET</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>Employee</role-name> 
    </auth-constraint> 
    <user-data-constraint> 
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 
+0

Xác thực được quản lý vùng chứa này được xác định trong Đặc tả Servlet. Đó có đủ chính thức cho bạn không? – EJP

+0

Chắc chắn sử dụng điều này & không mã giải pháp của riêng bạn! Đó là cách dự định. –

+0

Không chỉ vậy, nhưng theo thông tin về Nền tảng JEE, vùng chứa web sẽ biết danh tính và vai trò của người dùng, cho phép tích hợp tự động với EJB, JCA, v.v ... và cho phép truy cập có lập trình thông qua API chuẩn. request.isUserInRole (vai trò), request.getUserPrinciple() và tương tự từ EJB –

0

này cũng làm việc cho tôi

<filter> 
    <filter-name>SessionCheckFilter</filter-name> 
    <filter-class>yourjavapackage.SessionCheckFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>SessionCheckFilter</filter-name> 
    <!--url-pattern>/app/*</url-pattern--> 
    <url-pattern>/main.jsp</url-pattern> <!-- url from where you implement the filtering --> 
</filter-mapping> 


public class SessionCheckFilter implements Filter { 

    private String contextPath; 

    @Override 
    public void init(FilterConfig fc) throws ServletException { 
    contextPath = fc.getServletContext().getContextPath(); 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 

    if (req.getSession().getAttribute("LOGIN_USER") == null) { //checks if there's a LOGIN_USER set in session... 
     req.getRequestDispatcher("login.jsp").forward(req, resp); //or page where you want to redirect 
    } else { 
     String userType = (String) req.getSession().getAttribute("LOGIN_USER"); 
     if (userType.equals("ADMIN")){ //check if user type is admin 
     fc.doFilter(request, response); it redirected towards main.jsp 
     } 

    } 
    } 

    @Override 
    public void destroy() { 
    } 
} 
-4

Làm thế nào về việc sử dụng:

String username = request.getRemoteUser(); 
Các vấn đề liên quan