16

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

 HttpSession ses = req.getSession(true);

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

setAttribute("String", object);

将绑定“字符串”和值与 Session 对象。

getAttribute("String");

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

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

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

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

我的最后一个问题是

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

上面的两行是做什么的?什么将存储在 ctx & request 中? HttpSession ses = req.getSession(true);将创建新的会话方式。ses 中存储的值是多少。

4

4 回答 4

22

一些[随机]精度:

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

我建议您阅读有关 Java 会话的教程。根据 Java Web 服务器发送给浏览器的 JSESSIONID 请求/响应参数,每个用户都会获得一个不同的 HttpSession 对象。所以每个用户都可以有一个同名的属性,并且为这个属性存储的值对于所有用户来说都是不同的。

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

于 2010-09-08T13:32:15.657 回答
10

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

servlet 容器(例如 Tomcat)使用它的 JSESSIONID 来处理这个问题。

故事是这样的:

  1. 用户首先登录网站。
  2. Servlet 容器在用户浏览器上设置一个 COOKIE,存储一个唯一的 jsessionId。
  3. 每次用户访问网站时,都会返回 JSESSIONID cookie。
  4. servlet 容器使用它来跟踪谁是谁。
  5. 同样,这也是它跟踪数据分离的方式。每个用户都有自己的对象桶,由 JSESSIONID 唯一标识。

希望(至少部分)回答您的问题。

干杯

于 2010-09-08T13:38:00.290 回答
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 时,它只是做与上面相同的事情,只是通常请求对象不会传递到方法中,因此您使用 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);
}
}
于 2010-09-08T14:59:56.587 回答