2012-04-05 28 views
11

Câu hỏi chung về các servlet java và cách tốt nhất để xử lý các yêu cầu. Nếu tôi trúng phương pháp doGet của tôi từ một yêu cầu máy chủ từ xa:Java servlet - Session cleanup (HttpServletRequest)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    .... 
    <do work here> 
    .... 
    kill(request); 
} 

private void kill(HttpServletRequest request) { 
//How do I kill the user session here? 
} 

Sau khi tôi xử lý yêu cầu ở cuối của tôi và tạo đầu ra của tôi cho người yêu cầu, tôi muốn về cơ bản "giết" phiên của họ. Hiện tại, phiên đó kéo dài và do đó ăn hết bộ nhớ. Sau đó, khi đạt đến mức tối đa, tất cả các cuộc gọi khác đều hết thời gian chờ.

tôi đã cố gắng tạo ra một đối tượng HttpSession sử dụng các đối tượng yêu cầu, nhưng có kết quả tương tự:

HttpSession session = request.getSession(); 
session.invalidate(); 
+1

Tôi có ấn tượng rằng vấn đề cụ thể của bạn cần phải được giải quyết theo một cách khác. – BalusC

+0

Có thể. Mục tiêu cuối cùng là tôi muốn kết thúc một phiên trong nhóm phiên của tôi sau khi yêu cầu của họ được xử lý. Dù có hay không đang giết đối tượng yêu cầu hoặc tạo một đối tượng phiên cho phiên đó để xóa nó, tôi không chắc chắn. – user82302124

Trả lời

20
HttpSession session = request.getSession(false); 
if (session != null) { 
    session.invalidate(); 
} 

là cách đúng đắn để đi theo đề nghị của các tài liệu. Một phiên mới sẽ được tạo khi gửi yêu cầu mới.

Bạn đã đề cập rằng phiên của bạn vẫn chiếm bộ nhớ. Bạn có bất kỳ tham chiếu nào khác cho các đối tượng đó trong phiên không?

Bạn cũng có thể muốn có một cái nhìn tại địa chỉ: Servlet Session behavior and Session.invalidate

2

Hãy thử với

session = request.getSession(false); // so if no session is active no session is created 
if (session != null) 
    session.setMaxInactiveInterval(1); // so it expires immediatly 
1

Nếu bạn không muốn phiên hành vi tức là, có nhà nước giữa nhiều yêu cầu. Tại sao bạn muốn tạo/sử dụng phiên nào cả. Không tạo phiên hoặc không lưu trữ bất kỳ thứ gì trong phiên.

Để đảm bảo rằng mã của bạn không sử dụng phiên, hãy viết trình bao bọc yêu cầu sẽ ghi đè lên phương thức getSession().

5

bạn có thể loại bỏ một thuộc tính từ một phiên sử dụng

session.removeAttribute("attribute name"); 
Các vấn đề liên quan