What is session in Java?
到目前为止,我理解了Java中的HTTPSTealEngy概念。
1
| HttpSession ses = req.getSession(true); |
将根据请求创建会话对象。
1
| setAttribute("String", object); |
将"字符串"和值与会话对象绑定。
将返回与指定字符串关联的对象。
我无法理解的是:我正在创建一个会话对象HttpSession ses = req.getSession(true);并通过调用setAttribute("String", object);为其命名。在这里,这个代码驻留在服务器内部。对于每个人,当他尝试登录时,将执行服务器中的相同代码。setAttribute("String", object);在这个方法中,字符串值是一个常量。因此,创建的每个会话对象都将被我提供的相同字符串绑定。当我尝试检索字符串以验证其会话时,或者在执行注销操作时,getAttribute("String");将返回相同的常量字符串值(对吗?????实际上我不知道,我只是在考虑执行的逻辑)。那么,我怎样才能失效呢?
我在网上的所有教程中都看到了这种类型的插图。这是设置该属性的实际方法吗?或者,真正的应用程序开发人员将在"字符串"字段中提供一个变量来动态设置它。
(ie. session.setAttribut(userName, userName); //Setting the String Dynamically.. I dono is it right or not.)
最后一个问题是
1 2
| WebContext ctx = WebContextFactory.get();
request = ctx.getHttpServletRequest(); |
上面的两行是做什么的?CTX&REQUEST中将存储什么?HttpSession ses = req.getSession(true);将创建新的会话方式。SES中存储的值。
- 哦,天哪,你得等整整10分钟才能得到第一个答案…-P
- 会话与单个用户关联。两个不同的用户有不同的会话。如果要与同一用户共享某些内容,请对会话对象使用setattribute。如果在多次使用之间,则使用上下文对象。您还可以通过附加请求对象来共享对象。
一些[随机]精度:
您不需要登录/注销机制来进行会话。
在Java Servlet中,HTTP会话使用两种机制来跟踪:HTTP Cookie(最常用的)或URL重写(支持不带cookie的浏览器或禁用cookie)。只使用饼干很简单,你不必做任何特别的事情。要重新编写URL,需要修改指向servlet/过滤器的所有URL。
每次调用request.getSession(true)时,都会检查HttpRequest对象,以查找在cookie或/和url path参数(分号后面的内容)中编码的会话ID。如果找不到会话ID,则servlet容器(即服务器)将创建一个新会话。
会话ID作为cookie添加到响应中。如果您还想支持URL重写,那么应该使用response.encodeURL()方法修改HTML文档中的链接。如果找不到会话ID或会话ID指向无效会话,则调用request.getSession(false)或简单地调用request.getSession()将返回空值。
有一个HTTP会话通过访问,因为Java会话cookie不会永久地存储在浏览器中。因此会话对象不会在客户端之间共享。每个用户都有自己的私人会话。
如果在给定时间内不使用会话,则会自动销毁会话。超时值可以在web.xml文件中配置。
使用invalidate()方法可以显式地使给定的会话无效。
当人们谈论EDCOX1(7)时,它们指的是用于在Java中进行会话跟踪的HTTP Cookie的标准名称。
我建议你阅读一个关于Java会话的教程。每个用户根据JavaWeb服务器发送给浏览器的JSISTISID请求/响应参数得到不同的HTTPSEnter对象。因此,每个用户都可以有一个同名的属性,并且为该属性存储的值对于所有用户都是不同的。
另外,WebContextFactory和WebContext是DWR类,它们提供了获取servlet参数的简单方法。
- 不太清楚为什么会投反对票。
- 是的,我知道。但我无法理解该变量"ctx"和"request"中存储的内容。这就是我在里面要的。什么是WebContextFactory和WebContext?他们会怎么做?
- 你看过那些类的javadocs了吗?httpservletrequest:download.oracle.com/javaee/6/api/javax/servlet/http/…,webContextFactory:jarvana.com/jarvana/view/org/directwebremoting/dwr/2.0.3/…,webContext:jarvana.com/jarvana/view/org/directwebremoting/dwr/2.0.3/…
- JSessionID不是请求参数。
- 我不能理解,这就是为什么我问专业人员(stackoverflow),因为专业人员可以给出实际的观点。不管怎样,+1让我再次阅读那个文档。
据我所知,您关心的是在httpsession中存储东西时如何分离不同的用户。
servlet容器(例如tomcat)利用其jsessionid来处理这个问题。
故事是这样的:
用户首先登录网站。
servlet容器在上设置cookie用户的浏览器,存储JSSESSID。
每次用户点击网站,jsessionid cookie是送回去。
servlet容器使用它来跟踪谁是谁。
同样,这就是它保持跟踪的方式数据分离。每个用户有自己的存储桶由唯一标识的对象JSSESSID。
希望这(至少部分)能回答你的问题。
干杯
- 是的,你回答了我一半的问题。我必须做什么,才能使会话无效(即,我应该如何删除某个特定人员的会话对象,该人员单击注销)?
- 我相信session.invalidate()会终止会话,所以当用户下次访问站点时,他们将重新开始处理。
- 请注意,会话对象不是所有用户共享的单例对象-每个用户都有自己的对象!
- 赞成。。赞成。。。现在只有我明白了。谢谢你的回答。
- @所有:我问题的每一个答案,一点一点地清除我的疑虑。所以,我喜欢StackOverflow。谢谢大家。
你的基本servlet看起来像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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为您获取该请求。
1 2 3 4 5 6 7 8 9 10 11
| 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);
}
} |