什么是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中的值。
一些[随机]精度:
- 您不需要登录/注销机制来进行会话。
- 在java servlet中,使用两种机制跟踪HTTP会话,HTTP cookie(最常用)或URL重写(支持没有cookie或禁用cookie的浏览器)。 仅使用cookie很简单,您不必做任何特殊的事情。 对于URL重写,您需要修改指向servlet /filter的所有URL。
- 每次调用
request.getSession(true)
,都会检查HttpRequest
对象,以便查找在URL路径参数中的cookie OR / AND中编码的会话ID(分号后面是什么)。 如果找不到会话ID,servlet容器(即服务器)将创建一个新会话。 - 会话ID作为Cookie添加到响应中。 如果您还想支持URL重写,则应使用
response.encodeURL()
方法修改HTML文档中的链接。 如果未找到会话ID或会话ID引用无效会话,则调用request.getSession(false)
或仅调用request.getSession(false)
request.getSession()
将返回null。 - 访问时只有一个HTTP会话,因为Java会话cookie不会永久存储在浏览器中。 因此,客户端之间不会共享会话对象。 每个用户都有自己的私人会话。
- 如果在给定时间内未使用会话,则会自动销毁会话。 可以在
web.xml
文件中配置超时值。 - 可以使用
invalidate()
方法显式地使给定会话invalidate()
。 - 当人们谈论
JSESSIONID
,他们指的是用于在Java中进行会话跟踪的HTTP cookie的标准名称。
我建议你阅读有关Java会话的教程 。 每个用户根据Java Web服务器发送给浏览器的JSESSIONID请求/响应参数获取不同的HttpSession对象。 因此,每个用户都可以拥有一个具有相同名称的属性,并且为该属性存储的值对于所有用户将是不同的。
此外,WebContextFactory和WebContext是DWR类,它们提供了获取servlet参数的简便方法。
据我了解,您关心的是在HttpSession中存储内容时不同用户的分离。
servlet容器(例如Tomcat)利用其JSESSIONID来处理这个问题。
故事是这样的:
- 用户首先登录网站。
- Servlet容器在用户的浏览器上设置COOKIE,存储UNIQUE jsessionId。
- 每次用户访问网站时,都会发回JSESSIONID cookie。
- servlet容器使用它来跟踪谁是谁。
- 同样,这也是它跟踪数据分离的方式。 每个用户都有自己的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); } }