session对象初识

直以来以为用户访问一个网站,服务器就会自动帮你创建Session。现在才知道不是的。

Session什么时候生?

并不是你去访问网站时,而是遇到了HttpSeesion session=request.getSession()这段代码。(没有就给你创建一个)

什么时候死?

并不是你关闭浏览器或者去访问其他的网站的时候Session就死了,而是30分钟没有人用就死了。

(当然这时间可以在在WEB.XML里配置)

<session-config>

          <session-timeout>(你想要的时间,分钟为单位)</session-timeout>

</session-config>

现在粗略讲下服务器是如何实现一个session为一个用户浏览器服务的?

浏览器A访问servlet1(HttpSeesion session1=request.getSession()),服务器为其创建一个SeesionID,Servlet 容器又将 Session ID 作为 Cookie 保存在客户的浏览器中。当浏览器A访问servlet2时,客户端就把cookie的里的Session ID带过来,服务器也把之前创建的sessionID带过来,两者进行匹配。


现在问题是:

1,如果用户万一关闭了浏览器,session怎么办呢?

可以设置cookie的最大生命周期,(下面是设置30分钟)

……

HttpSeesion session=request.getSession();

String Sessionid=session.getId();

Cookie cookie=new Cookie("JSEESIONID",sessionid);

Cookie.setPath("/(网站的路径)");

cookie.setMaxAge(30*60);

response.addCookie(cookie);

……

2,如果用户浏览器禁用了cookie,SessionID怎么带过去?

先说说HttpSeesion session=request.getSession();这段代码。

他获取SessionID时,先看看cookie有木有带SessionID过来,再看看超链接有木有带SessionID过来。如果两者都没有,它就创建一个Seesion。带过来了就获取服务器之前创建的SessionID。那么如果浏览器禁用了cookie了,想Seesion还可以用,就要重写URL

HttpServletResponse 接口提供了重写 URL 的方法:public Java.lang.String encodeURL(java.lang.String url),此方法能将用户的SessionID追加到网址的末尾,

   <a href=“<%=response.encodeURL(“a.jsp“)%>“>

如果是重定向,就response.sendRedirect(response.encodeRedirectURL("a.jsp"));

这样即使浏览器禁用了cookie,session还是可以用 了。





二:

在学习servlet时会发现,关闭浏览器,再打开新浏览器并发送请求,会生成了一个与关闭浏览器之前不同的新的session对象。所以初学者会有这样一种理解,就是浏览器关闭后服务端会清除session对象。但实际上是不是这样的呢? 

        Session是在客户端请求到达服务器时,服务器为此请求发出的客户所创建的一个对象,保存在服务器端。购物车是一个很好的例子,一个用户可以有很多session,但每个session只针对一个用户,这就保证了不同session之间的信息独立。 

        首先说明一点,在通常意义上,session所能发挥作用是基于cookie机制。针对所需要解释的问题,做这样一个假设:我们第一次访问一个网页。当客户端发送请求后,服务端会建立一个针对此请求发出客户的session对象,而且每个session都会有一个sessionID。服务端会自动将这个sessionID作为一个cookie附加到response上返回给客户端,这个cookie存放在浏览器内存中。我们每次对此网页发送的request都会附带着这个cookie,服务端收到这个请求后会都去cookie中取得这个sessionID,然后查询服务端是否存在一个对应此ID的session对象。如果有,可以直接使用此session;如果没有,则会新建一个。当浏览器关闭后,其所占的内存就会是放掉,cookie自然也就被清除了,此时我们不再保存有这个sessionID。所以再打开浏览器访问同一个页面时,由于没有sessionID,也就查不到对应的session对象,此时重新创建一个新的session对象。 

        那当我们关闭浏览器之后,服务器端原来的session对象是否还存在呢?答案是肯定的。服务端根本不知道我们是否关闭了浏览器,也不关心这个。客户端与服务端之间进行通信的唯一途径就是通过请求。服务器有自己的一套机制来管理session,比如多长时间会清除没有使用过的session对象,等等。 

        所以说,关闭浏览器session就被清除只是我们所看到的表面现象(实际上是新建了一个session对象),通常情况下,服务器并不会马上清除session对象,但这个根据服务端的设定而不同。 

        PS:cookie一般分为两种:一种是会话cookie,即服务端为session自动创建的cookie,这个cookie存放在浏览器进程中。另一种是可以存放在硬盘上的,可以通过服务端的某些设置,将一些信息放到cookie中并返回给客户端存放在硬盘上。 

       

  •         在以下情况中,session会结束生命周期,Servlet容器会将session所占用的资源释放掉: 
           
  • 客户端关闭浏览器(虽然不是这样,但还是这么说吧,解释参见上面)        
  • Session过期        
  • 服务器端调用了HttpSession的invalidate()方法   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值