Java中的会话是啥? [复制]
Posted
技术标签:
【中文标题】Java中的会话是啥? [复制]【英文标题】:What is session in Java? [duplicate]Java中的会话是什么? [复制] 【发布时间】:2011-04-09 17:59:48 【问题描述】:到目前为止,我了解 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中存储了什么值。
【问题讨论】:
一个会话与单个用户相关联。两个不同的用户有不同的会话。如果您想与同一用户共享某些内容,请在会话对象上使用 setAttribute。如果在多个使用之间,则使用上下文对象。您也可以通过附加请求对象来共享对象。 【参考方案1】:一些[随机]精度:
-
您不需要登录/注销机制来进行会话。
在 java servlet 中,使用两种机制跟踪 HTTP 会话,HTTP cookie(最常用)或 URL 重写(以支持没有 cookie 或禁用 cookie 的浏览器)。仅使用 cookie 很简单,您不必做任何特别的事情。对于 URL 重写,您需要修改所有指向您的 servlet/过滤器的 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()
将返回 null。
visit 只有一个 HTTP 会话,因为 Java 会话 cookie 不会永久存储在浏览器中。因此会话对象不在客户端之间共享。每个用户都有自己的私人会话。
如果在给定时间内未使用,会话将自动销毁。超时值可以在web.xml
文件中配置。
可以使用invalidate()
方法明确地使给定会话无效。
当人们谈论 JSESSIONID
时,他们指的是用于在 Java 中进行会话跟踪的 HTTP cookie 的标准名称。
【讨论】:
【参考方案2】:我建议您阅读有关 Java 会话的 tutorial。根据 Java Web 服务器发送给浏览器的 JSESSIONID 请求/响应参数,每个用户都会获得一个不同的 HttpSession 对象。所以每个用户都可以有一个同名的属性,并且为这个属性存储的值对于所有用户来说都是不同的。
此外,WebContextFactory 和 WebContext 是 DWR 类,它们提供了一种简单的方法来获取 servlet 参数。
【讨论】:
不太清楚为什么这被否决了。 是的,我知道。但我无法理解将存储在该变量“ctx”和“请求”中的内容。这就是我在那里问的。什么是 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 不是请求参数。 我无法理解那里,这就是为什么我问专业人士(***),因为专业人士可以给出实用的观点。无论如何,+1 让我再次阅读该文档。【参考方案3】:据我了解,您关心的是在 HttpSession 中存储内容时不同用户的分离。
servlet 容器(例如 Tomcat)利用它的 JSESSIONID 来处理这个问题。
故事是这样的:
-
用户首先登录网站。
Servlet 容器设置了一个 COOKIE
用户的浏览器,存储一个 UNIQUE
jsessionId。
每次用户点击
网站,JSESSIONID cookie 是
寄回。
servlet 容器使用它来
跟踪谁是谁。
同样,它是这样跟踪的
关于数据的分离。每一个
用户有自己的桶
唯一标识的对象
JSESSIONID。
希望(至少部分)回答您的问题。
干杯
【讨论】:
是的,你已经回答了我一半的问题。我必须做什么,使会话无效(即如何删除单击注销的特定人的会话对象)? 我相信 session.invalidate() 会终止会话,因此当用户下次访问该站点时,他们的流程将重新开始。 请注意会话对象不是所有用户共享的单例 - 每个用户都有自己的对象! 是的……是的……现在只有我明白了。谢谢你的回答。 @All:我的问题的每一个答案,都会一点一点地消除我的疑问。这就是为什么,我喜欢 ***。谢谢大家。【参考方案4】:你的基本 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);
【讨论】:
以上是关于Java中的会话是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
java中的serialVersionUID是啥,通常在异常类中? [复制]