2010-09-08 7 views
10

Cho đến nay tôi hiểu các khái niệm Httpsession trong Java.Phiên làm việc trong Java là gì?

HttpSession ses = req.getSession(true); 

sẽ tạo đối tượng phiên, theo yêu cầu.

setAttribute("String", object); 

sẽ, liên kết 'Chuỗi' và giá trị với đối tượng Phiên.

getAttribute("String"); 

sẽ trả về đối tượng được liên kết với chuỗi, được chỉ định.

gì tôi không thể hiểu là: Tôi đang tạo ra một đối tượng session như HttpSession ses = req.getSession(true); và thiết lập một tên cho nó bằng cách gọi setAttribute("String", object);. Ở đây, Mã này nằm bên trong máy chủ. Đối với mọi người, khi anh ta cố gắng đăng nhập cùng một mã trong máy chủ sẽ được thực hiện. setAttribute("String", object); trong phương pháp này giá trị chuỗi là một hằng số. Vì vậy, mỗi đối tượng phiên tạo ra sẽ được ràng buộc bởi cùng một chuỗi mà tôi đã cung cấp. Khi tôi cố gắng truy xuất chuỗi để xác thực phiên của anh ấy hoặc khi hành động đăng xuất được thực hiện, thì getAttribute("String"); sẽ trả về cùng một giá trị chuỗi không đổi (Tôi có đúng không !! ?? Thật ra tôi không biết, tôi chỉ đang nghĩ đến việc thực thi logic của nó). Sau đó, làm thế nào tôi có thể làm mất hiệu lực.

Tôi đã thấy loại hình minh họa này trong tất cả các hướng dẫn trên WEB. Đó có phải là cách thực tế để thiết lập thuộc tính đó không? Hoặc, các nhà phát triển ứng dụng thực tế sẽ cung cấp cho một biến trong lĩnh vực "String" để cài đặt nó tự động

(ie. session.setAttribut(userName, userName); //Setting the String Dynamically.. I dono is it right or not.)

Và câu hỏi cuối cùng của tôi là

WebContext ctx = WebContextFactory.get(); 
request = ctx.getHttpServletRequest(); 

gì hai dòng trên làm gì? Điều gì sẽ được lưu trữ trong yêu cầu ctx &? HttpSession ses = req.getSession(true); sẽ tạo phương tiện phiên mới. Giá trị gì được lưu trữ trong ses.

+28

Rất tiếc, bạn phải chờ hết 10 phút cho câu trả lời đầu tiên ... :-P –

+1

Phiên được kết hợp với một người dùng. Hai người dùng khác nhau có phiên khác nhau. Nếu bạn muốn chia sẻ điều gì đó với cùng một người dùng thì hãy sử dụng setAttribute trên đối tượng phiên.Nếu giữa nhiều hơn một sử dụng, sau đó sử dụng đối tượng bối cảnh.Bạn cũng có thể chia sẻ các đối tượng bằng cách gắn với một đối tượng yêu cầu. –

Trả lời

14

Một số [ngẫu nhiên] precisions:

  1. Bạn không cần cơ chế đăng nhập/đăng xuất để có phiên.
  2. Trong các servlet java, các phiên HTTP được theo dõi bằng cách sử dụng hai cơ chế, cookie HTTP (thường được sử dụng) hoặc viết lại URL (để hỗ trợ các trình duyệt không có cookie hoặc cookie bị vô hiệu hóa). Chỉ sử dụng cookie đơn giản, bạn không phải làm gì đặc biệt. Để viết lại URL, bạn cần phải sửa đổi tất cả các URL trỏ về các servlet/bộ lọc của bạn.
  3. Mỗi lần bạn gọi request.getSession(true), đối tượng HttpRequest sẽ được kiểm tra để tìm ID phiên được mã hóa trong cookie HOẶC/VÀ trong tham số đường dẫn URL (thông tin sau dấu chấm phẩy). Nếu không tìm thấy ID phiên, một phiên mới sẽ được tạo bởi thùng chứa servlet (tức là máy chủ).
  4. ID phiên được thêm vào phản hồi dưới dạng Cookie. Nếu bạn muốn hỗ trợ viết lại URL, các liên kết trong tài liệu HTML của bạn phải được sửa đổi bằng phương pháp response.encodeURL(). Gọi số request.getSession(false) hoặc đơn giản là request.getSession() sẽ trả lại giá trị null trong trường hợp ID phiên không được tìm thấy hoặc ID phiên đề cập đến phiên không hợp lệ.
  5. Có một phiên HTTP duy nhất bằng cách truy cập, vì cookie phiên Java không được lưu trữ vĩnh viễn trong trình duyệt. Vì vậy, phiên đối tượng không được chia sẻ giữa các khách hàng. Mỗi người dùng có phiên riêng của riêng mình.
  6. Phiên bị hủy tự động nếu không được sử dụng trong một thời gian nhất định. Giá trị hết giờ có thể được định cấu hình trong tệp web.xml.
  7. Phiên cụ thể có thể bị vô hiệu hóa một cách rõ ràng bằng phương pháp invalidate().
  8. Khi mọi người đang nói về JSESSIONID, họ đang đề cập đến tên chuẩn của cookie HTTP được sử dụng để thực hiện theo dõi phiên trong Java.
11

Tôi khuyên bạn nên đọc tutorial trên các phiên Java. Mỗi người dùng nhận một đối tượng HttpSession khác nhau, dựa trên tham số yêu cầu/phản hồi JSESSIONID mà máy chủ web Java gửi tới trình duyệt. Vì vậy, mọi người dùng đều có thể có thuộc tính có cùng tên và giá trị được lưu trữ cho thuộc tính này sẽ khác nhau đối với tất cả người dùng.

Ngoài ra, WebContextFactory và WebContext là các lớp DWR cung cấp một cách dễ dàng để lấy các thông số servlet.

+0

Không thực sự chắc chắn lý do tại sao điều này đã được downvoted. – Pat

+0

Vâng, tôi biết điều đó. Nhưng tôi không thể hiểu những gì sẽ được lưu trữ trong biến 'ctx' & 'yêu cầu'. Đó là những gì tôi hỏi trong đó. WebContextFactory và WebContext là gì? Họ sẽ làm gì? –

+2

Bạn đã xem qua các javadocs cho các lớp đó chưa? HttpServletRequest: http://download.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html, WebContextFactory: http://www.jarvana.com/jarvana/view/org/directwebremoting/dwr/ 2.0.3/dwr-2.0.3-javadoc.jar! /org/directwebremoting/WebContextFactory.html và WebContext: http://www.jarvana.com/jarvana/view/org/directwebremoting/dwr/2.0.3/ dwr-2.0.3-javadoc.jar! /org/directwebremoting/WebContext.html –

8

Như tôi đã hiểu, mối quan tâm của bạn là về việc tách biệt những người dùng khác nhau khi lưu trữ mọi thứ trong HttpSession.

Thùng chứa servlet (ví dụ Tomcat) sẽ xử lý việc này bằng cách sử dụng JSESSIONID của nó.

Câu chuyện đi như thế này:

  1. tài khoản bản ghi đầu tiên lên trang web.
  2. Bộ chứa Servlet đặt COOKIE trên trình duyệt của người dùng, lưu trữ UNIQUE jsessionId.
  3. Mỗi lần người dùng truy cập trang web , cookie JSESSIONID là được gửi lại.
  4. Thùng chứa servlet sử dụng công cụ này để theo dõi ai là ai.
  5. Tương tự như vậy, đây là cách theo dõi tách dữ liệu. Mỗi người dùng đều có thùng của riêng họ là đối tượng được xác định duy nhất bởi JSESSIONID.

Hy vọng rằng (ít nhất một phần) sẽ trả lời câu hỏi của bạn.

Cheers

+0

Vâng, bạn đã trả lời một nửa câu hỏi của tôi. Những gì tôi phải làm, để làm mất hiệu lực một phiên (nghĩa là tôi sẽ xóa đối tượng phiên cho một người cụ thể, người nhấp vào Đăng xuất) như thế nào? –

+0

Tôi tin session.invalidate() sẽ giết phiên, vì vậy khi người dùng tiếp theo truy cập trang web, họ sẽ bắt đầu lại quá trình này. – lucas1000001

+0

Xin lưu ý rằng đối tượng phiên không phải là một singleton được chia sẻ bởi tất cả người dùng - mỗi người dùng có đối tượng rất riêng của họ! – lucas1000001

3

servlet cơ bản của bạn sẽ trông giống như

public class MyServlet{ 

public doGet(HttpServletRequest req, HttpServletResponse res){ 
//Parameter true: 
// create session if one does not exist. session should never be null 
//Parameter false: 
// return null if there is no session, used on pages where you want to 
// force a user to already have a session or be logged in 
//only need to use one of the two getSession() options here. 
//Just showing both for this test 
HttpSession sess = req.getSession(true); 
HttpSession sess2 = req.getSession(false); 

//set an Attribute in the request. This can be used to pass new values 
//to a forward or to a JSP 
req.setAttribute("myVar", "Hello World"); 
} 

} 

Không cần phải cài đặt bất kỳ tên thuộc tính cho phiên của bạn đã được thực hiện. Như những người khác đã đề xuất trong các câu trả lời khác, hãy sử dụng cookie hoặc URL viết lại để lưu trữ sessionID cho bạn.

Khi bạn đang đối phó với DWR WebContext, nó chỉ đơn giản là làm điều tương tự như trên, chỉ cần bình thường đối tượng Request không được thông qua vào phương pháp này, vì vậy bạn sử dụng WebContext để có được yêu cầu đó cho bạn

public class DWRClass { 
public doSomething(){ 
WebContext ctx = WebContextFactory.get(); 
HttpServletRequest req = ctx.getHttpServletRequest(); 
HttpSession sess = req.getSession(); //no parameter is the same as passing true 

//Lets set another attribute for a forward or JSP to use 
ArrayList<Boolean> flags = new ArrayList<Boolean>(); 
req.setAttribute("listOfNames", flags); 
} 
}