什么是Java会话?

时间:2010-09-08 13:23:10

标签: java session servlets dwr

到目前为止,我理解Java中的Httpsession概念。

 HttpSession ses = req.getSession(true);

将根据请求创建会话对象。

setAttribute("String", object);

将绑定'String',并将值与Session对象绑定。

getAttribute("String");

将返回与指定字符串关联的对象。

我无法理解的是:我正在创建一个像这样的会话对象 HttpSession ses = req.getSession(true); 并通过调用setAttribute("String", object);为其设置名称。 这里,此代码驻留在服务器内部。对于每个人,当他尝试登录服务器中的相同代码时将被执行。此方法中的setAttribute("String", object);字符串值是常量值。因此,创建的每个会话对象都将使用我提供的相同字符串进行绑定。当我尝试检索字符串以验证他的会话或在注销操作时getAttribute("String"); ll返回相同的常量字符串值(我是对的!! ??实际上我不知道,我只是想到它的执行逻辑)。然后,我怎么能够无效。

我在WEB上的所有教程中都看到了这种类型的插图。它是设置该属性的实际方法吗?或者,真正的应用程序开发人员将在“字符串”字段中给出一个变量来动态设置它

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

我的最后一个问题是

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

上面两行有什么作用?什么将存储在ctx&请求? HttpSession ses = req.getSession(true);将创建新的会话方式。存储在ses中的值。

4 个答案:

答案 0 :(得分:17)

一些[随机]精度:

  1. 您不需要登录/注销机制来进行会话。
  2. 在java servlet中,使用两种机制跟踪HTTP会话,HTTP cookie(最常用)或URL重写(支持没有cookie或禁用cookie的浏览器)。仅使用cookie很简单,您不必做任何特殊的事情。对于URL重写,您需要修改指向servlet / filters的所有URL。
  3. 每次调用request.getSession(true)时,都会检查HttpRequest对象,以便查找在Cookie路径参数中的Cookie OR / AND中编码的会话ID(分号后面是什么) )。如果找不到会话ID,则servlet容器(即服务器)将创建一个新会话。
  4. 会话ID作为Cookie添加到响应中。如果您还想支持URL重写,则应使用response.encodeURL()方法修改HTML文档中的链接。如果未找到会话ID或会话ID指的是无效会话,则调用request.getSession(false)或简称request.getSession()将返回null。
  5. 访问只有一个HTTP会话,因为Java会话cookie不会永久存储在浏览器中。因此,客户端之间不会共享会话对象。每个用户都有自己的私人会话。
  6. 如果在给定时间内未使用会话,则会自动销毁会话。可以在web.xml文件中配置超时值。
  7. 使用invalidate()方法可以明确地使给定会话无效。
  8. 当人们谈论JSESSIONID时,他们指的是用于在Java中进行会话跟踪的HTTP cookie的标准名称。

答案 1 :(得分:12)

我建议您阅读有关Java会话的tutorial。每个用户根据Java Web服务器发送给浏览器的JSESSIONID请求/响应参数获取不同的HttpSession对象。因此,每个用户都可以拥有一个具有相同名称的属性,并且为该属性存储的值对于所有用户都是不同的。

此外,WebContextFactory和WebContext是DWR类,它们提供了获取servlet参数的简便方法。

答案 2 :(得分:8)

据我了解,您关心的是在HttpSession中存储内容时不同用户的分离。

servlet容器(例如Tomcat)利用其JSESSIONID来处理这个问题。

故事是这样的:

  1. 用户首先登录网站。
  2. Servlet容器设置COOKIE 用户的浏览器,存储UNIQUE JSESSIONID。
  3. 每次用户点击时 网站,JSESSIONID cookie是 送回来。
  4. servlet容器使用它来 跟踪谁是谁。
  5. 同样,这就是它如何跟踪 分离数据。一切 用户有自己的桶 由...唯一标识的对象 JSESSIONID。
  6. 希望(至少部分)回答你的问题。

    干杯

答案 3 :(得分:3)

您的基本servlet看起来像

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");
}

}

无需为已完成的会话设置任何属性名称。正如其他人在其他答案中建议的那样,使用cookie或URL重写来为您存储sessionID。

当您处理DWR WebContext时,它只是执行与上面相同的操作,通常只是Request对象不会传递给方法,所以您使用WebContext来获取该请求

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);
}
}