到目前为止,我理解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中的值。
答案 0 :(得分:17)
一些[随机]精度:
request.getSession(true)
时,都会检查HttpRequest
对象,以便查找在Cookie路径参数中的Cookie OR / AND中编码的会话ID(分号后面是什么) )。如果找不到会话ID,则servlet容器(即服务器)将创建一个新会话。 response.encodeURL()
方法修改HTML文档中的链接。如果未找到会话ID或会话ID指的是无效会话,则调用request.getSession(false)
或简称request.getSession()
将返回null。web.xml
文件中配置超时值。invalidate()
方法可以明确地使给定会话无效。JSESSIONID
时,他们指的是用于在Java中进行会话跟踪的HTTP cookie的标准名称。答案 1 :(得分:12)
我建议您阅读有关Java会话的tutorial。每个用户根据Java Web服务器发送给浏览器的JSESSIONID请求/响应参数获取不同的HttpSession对象。因此,每个用户都可以拥有一个具有相同名称的属性,并且为该属性存储的值对于所有用户都是不同的。
此外,WebContextFactory和WebContext是DWR类,它们提供了获取servlet参数的简便方法。
答案 2 :(得分:8)
据我了解,您关心的是在HttpSession中存储内容时不同用户的分离。
servlet容器(例如Tomcat)利用其JSESSIONID来处理这个问题。
故事是这样的:
希望(至少部分)回答你的问题。
干杯
答案 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);
}
}