什么是Java会话?

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

HttpSession ses = req.getSession(true); 

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

 setAttribute("String", object); 

将使用Session对象绑定’String’和value。

 getAttribute("String"); 

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

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

我在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和请求中? HttpSession ses = req.getSession(true); 将创建新的会话手段。 存储在ses中的值。

一些[随机]精度:

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

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

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

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

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

故事是这样的:

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

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

干杯

你的基本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 flags = new ArrayList(); req.setAttribute("listOfNames", flags); } }