对JESSIONID理解

来源:互联网 发布:非主流 知乎 编辑:程序博客网 时间:2024/05/22 02:03

熟悉web开发师经常会提到回话,什么是一个回话。比如你打开一个浏览器访问一个网站之后都是为一个回话。它是依靠服务器和浏览器一起维护

JESSEIONID就是讲服务器和浏览器结合一起的桥梁。

如何实现了?

下面是我的设想:

当你登录会服务器会有个map来存放这个回话值为JESSIONID的值,value为另一个map这个map就是Session吧

但你第一次访问是它会addCook的方式把这个JESSIONID给你。key为JESSIONID,value为JESSIONID的值

下次你浏览器访问会看有JESSIONID的cookie吗有就带过去,没有就不带。这样就会维持了一个回话。当你的浏览器这个JESSIONID也就会删掉了



Session技术分析与理解

   

Session技术分析与理解

  • session是什么
  • session和cookie的区别
  • session的原理
  • session的使用方法
  • session使用需注意的细节

1.session是什么 
首先引入度神的解释:Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用 Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。注意 会话状态仅在支持 cookie 的浏览器中保留。

博主俗人的理解: 服务器端为了保存某些数据,或实现某些必要的功能,当用户访问服务器时,将数据临时保存在服务器端以供完成服务器端的其他某些功能。服务器需要保存的数据可以以cookie的方式存储在客户端,而session的功能就是将服务器需要保存的数据存储在服务端。例如账号登录记录的功能,可以以session的方式将登录状态保存在服务器端,这样当用户访问其他程序时,需要用到登录的地方,都可以从该用户的session中取出该用户的数据,为用户服务。

2.session和cookie的区别

cookie是将用户的数据写给客户端(浏览器) 
session是把用户数据写到服务器中用户独占的session里

3.session的原理

session的底层是基于cookie技术来实现的,当用户打开浏览器,去访问服务器的时候,服务器会为每个用户的浏览器创建一个会话对象(session对象),并且为每个session对象创建一个Jsessionid号。当session对象创建成功后,会以cookie的方式将这个Jsessionid号回写给浏览器,当用户再次进行访问服务器时,及带了具有Jsessionid号的cookie数据来一起访问服务器,服务器通过不同session的 Jsessionid号来找出与其相关联的session对象,通过不同的session对象来为不同的用户服务。

原理图


4.session的使用方法

Demo1:将name保存到session里再将name从session里面取出来

Servlet1

        response.setCharacterEncoding("utf-8");        response.setContentType("text/html;charset=utf-8");        HttpSession httpSession=request.getSession();        httpSession.setAttribute("name","zhangsan");        response.getWriter().write("已经将名字保存在session中");
  • 1
  • 2
  • 3
  • 4
  • 5

Servlet2

        response.setCharacterEncoding("utf-8");        response.setContentType("text/html;charset=utf-8");        HttpSession httpSession=request.getSession(false);        String name=(String) httpSession.getAttribute("name");        response.getWriter().write("sesson的值为"+name);
  • 1
  • 2
  • 3
  • 4
  • 5

Demo2:由于session的生效期为一个会话(及关闭浏览器就无法获得name值),但前面说了,session的内部原理为回写jsessionid号作为标识,则我们可以覆盖回写cookie的操作,设置cookie的有效期,同时也改变了session有效期(最大半小时),这样即使关闭浏览器,再次打开浏览器也能获取到name值。

Servlet1

        response.setCharacterEncoding("utf-8");        response.setContentType("text/html;charset=utf-8");        HttpSession httpSession=request.getSession();        String jsessionid=httpSession.getId();        Cookie cookie=new Cookie("JSESSIONID",jsessionid);        cookie.setPath("/Learn1");        cookie.setMaxAge(30*60);        response.addCookie(cookie);        httpSession.setAttribute("name","zhangsan");        response.getWriter().write("已经将名字保存在session中");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Servlet2

        response.setCharacterEncoding("utf-8");        response.setContentType("text/html;charset=utf-8");        HttpSession httpSession=request.getSession(false);        String name=(String) httpSession.getAttribute("name");        response.getWriter().write("sesson的值为"+name);
  • 1
  • 2
  • 3
  • 4
  • 5

Demo3: 由于有些用户浏览器可能禁止cookie的使用,导致我们的session失效了,我们面对这种情况可以采取url重写的方式,及在每个超链接背后接入jsessionid.(此种方法关闭会话浏览器后无效)

5.session使用需注意的细节

  1. 在internet explorer7之前,打开一个浏览器为一个会话,session的作用域为一个浏览器。但目前浏览器版本,即使打开两个浏览器,他们共享session对象。
  2. 一个浏览器的多个选项卡,共享一个session对象。
  3. session的有效期最大为半个小时,及客户端半小时内无任何操作,服务器将会把该session对象摧毁。
  4. session的回写cookie的ID名字为:JSESSIONID

0 1
原创粉丝点击