什么是Java会话?

What is session in Java?

本问题已经有最佳答案,请猛点这里访问。

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

1
 HttpSession ses = req.getSession(true);

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

1
setAttribute("String", object);

将"字符串"和值与会话对象绑定。

1
getAttribute("String");

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

我无法理解的是:我正在创建一个会话对象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中存储的值。


一些[随机]精度:

  • 您不需要登录/注销机制来进行会话。
  • 在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参数的简单方法。


    据我所知,您关心的是在httpsession中存储东西时如何分离不同的用户。

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

    故事是这样的:

  • 用户首先登录网站。
  • servlet容器在上设置cookie用户的浏览器,存储JSSESSID。
  • 每次用户点击网站,jsessionid cookie是送回去。
  • servlet容器使用它来跟踪谁是谁。
  • 同样,这就是它保持跟踪的方式数据分离。每个用户有自己的存储桶由唯一标识的对象JSSESSID。
  • 希望这(至少部分)能回答你的问题。

    干杯


    你的基本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);
    }
    }