2010-04-24 37 views
5

Tôi đang triển khai ứng dụng web, sử dụng phiên. Tôi đang sử dụng GWT và công cụ ứng dụng như máy khách/máy chủ của tôi, nhưng tôi không nghĩ rằng họ đang làm bất kỳ điều gì thực sự khác với tôi và PHP, v.v. Tôi đang sử dụng HttpSession để bắt đầu một phiên cho họ. Tôi nhận được id phiên như sau:Bạn giữ cookie phiên trong bao lâu?

// From my login servlet: 
getThreadLocalRequest().getSession(false).getId(); 

Tôi trả lại phiênId lại cho khách hàng và lưu trữ nó trong cookie. Các hướng dẫn, tôi đang sử dụng bộ cookie này để 'hết hạn' trong hai tuần:

Cookie.write("sid", theSessionId, 1000 * 60 * 60 * 24 * 14); // two weeks 

Đây là nơi tôi đang bối rối: nếu cookie hết hạn trong hai tuần, sau đó người dùng của tôi sẽ đi cùng bằng cách sử dụng ứng dụng web hạnh phúc, chỉ một ngày duyệt đến trang web của tôi và được hiển thị một màn hình đăng nhập. Những lựa chọn của tôi là gì? Tôi có thể đặt không có thời gian hết hạn cho cookie này không? Bằng cách đó, người dùng sẽ phải đăng xuất một cách rõ ràng, nếu không họ chỉ có thể sử dụng ứng dụng mãi mãi mà không phải đăng nhập lại?

Hoặc có cách nào tốt hơn để thực hiện việc này không? Tôi không thể nhớ các trang web như Twitter đã từng yêu cầu tôi đăng nhập lại. Tôi dường như đã đăng nhập vĩnh viễn. Họ có chỉ đặt không hết hạn không?

Ứng dụng web không bảo vệ bất kỳ loại dữ liệu nhạy cảm nào, vì vậy tôi không ngại để lại cookie không hết hạn, nhưng có vẻ như phải có cách tốt hơn?

Đây là hướng dẫn tôi tham khảo:

http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ

Cảm ơn

+1

Thông thường, rất nhiều ứng dụng web tôi đã thấy cho phép bạn đánh dấu "giữ tôi đăng nhập", giúp bạn đăng nhập vô thời hạn hoặc nếu không đăng nhập bạn sau khi trình duyệt đóng. – Corey

Trả lời

3

Các HttpSession là đằng sau hậu trường đã được hỗ trợ bởi một cookie. Kiểm tra danh sách cookie của trình duyệt cho một tên có tên là jsessionid. Hơn nữa, khi nhận được một cá thể, bạn nên gọi getSession() mà không cần false, nếu không bạn có thể gặp rủi ro khi NullPointerException khi chưa được tạo và do đó sẽ trả lại null.

Khi bạn đăng nhập, bạn thường đăng nhập User trong phiên.

User user = userDAO.find(username, password); 
if (user != null) { 
    session.setAttribute("user", user); 
} else { 
    // Handle error "Unknown username/password combo." 
} 

Bạn có thể để chặn webapplication của bạn trên đăng nhập User bởi chỉ kiểm tra sự hiện diện của nó trong phiên. Ví dụ: trong một Filter mà bạn muốn sử dụng để chặn các trang được bảo mật.

if (session.getAttribute("user") == null) { 
    response.sendRedirect("login"); 
} else { 
    chain.doFilter(request, response); 
} 

HttpSession có hầu hết các webcontainers thời gian chờ mặc định là 30 phút. Nói cách khác, nó sẽ hết hạn sau 30 phút kể từ lần yêu cầu cuối cùng. Điều này có thể được cấu hình trong web.xml như sau:

<session-config> 
    <session-timeout>10</session-timeout> 
</session-config> 

Thời gian chờ tính bằng phút (ví dụ trên 10 phút).

Nếu bạn muốn cung cấp một (tự động) "Hãy nhớ tôi trên máy tính này" tùy chọn, sau đó bạn phải tạo khác cookie với khác nhận dạng.Tôi đã đăng trước đó một câu trả lời chi tiết về điều đó: Java - How do I keep a user logged into my site for months?

+0

Ok vì vậy tôi không thực sự cần phải làm bất cứ điều gì phía khách hàng để hỗ trợ điều này sau đó? Tôi đã thử nghiệm trên công cụ ứng dụng và hoạt động, nhưng phiên không được giữ lại sau khi tôi đóng trình duyệt, ngay cả khi tôi đặt thời lượng hết thời gian chờ phiên trong web.xml. Tôi đoán điều đó không quan trọng bởi vì phần thứ hai 'giữ người dùng đăng nhập vào trang web của tôi trong nhiều tháng' nên đề cập đến nó? Cảm ơn – user246114

+0

Đúng vậy. Khi bạn tắt trình duyệt web, tất cả các cookie không có độ tuổi sẽ bị thu gọn. Bạn cần phải cung cấp cookie của riêng bạn bất cứ khi nào bạn muốn giữ nó lâu hơn một chút. – BalusC

+1

Ok điều đó có ý nghĩa - nhưng sau đó tôi nhầm lẫn về cách bạn có thể thực hiện đăng nhập tự động ngay lập tức như trong câu trả lời câu hỏi khác của bạn? Khi người dùng khởi động lại trình duyệt của họ, jsessionid bị xóa. Vì vậy, khi khởi động lại tiếp theo, trình duyệt sẽ truy cập www.mysite.com và * không * xem nó có jsessionid. Do đó máy chủ sẽ phục vụ trang như thể người dùng * không * được xác thực. Nó sẽ yêu cầu khách hàng thực hiện một chuyến đi trở lại máy chủ ngay bây giờ để nói rằng người dùng thực tế đã được xác thực. Có cách nào để trình duyệt gửi cookie của riêng tôi trên bản trình bày đầu tiên không? Sẽ xây dựng trong bản chỉnh sửa Q gốc, cảm ơn! – user246114

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