servlet的session的生命周期

时间:2023-03-08 19:49:44

谈到javaweb首先想到的就是servlet,说道servlet就会想到servlet的生命周期

说道servlet的生命周期 就绕不过servlet的三个方法init service destroy

当我们将web项目部署到服务器,服务器启动的时候,这个时候servlet还没创建,,服务器启动了  开始对外提供服务,客户端可以访问了,

当某一个客户端第一次访问时候此servlet时候------》服务器找不到servlet对象-------》这个时候服务器就会创建servlet对象,并且调用init方法,使servlet初始化,获得他的初始化参数------》init方法调用完成serlvet对象就可以对外提供服务-------》web服务器调用servlet的service方法给客户端提供服务---》service服务完成servlet继续存在-------》第二客户端继续访问此servlet--------》服务器继续寻找servlet对象--------》存在此servlet对象-------》调用此对象的servlet方法提供服务。。。。。。---》不遇到特殊原因知道服务器关闭之前一直存在-------》当web服务器正常关闭的时候,此时调用servlet的destroy方法销毁,,,

当web服务器异常关闭时可能不会调用servlet的destroy方法,,,,

重点:

1.servlet不是一启动web服务器就创建对象,而是要客户端第一次访问,web服务器先查看自己有没有这个对象,没有才会创建,

  但是有些servlet比较特殊,Web服务器创建时候创建,这是特殊的servlet

2.当web服务器创建servlet对象时候  就会调用init方法初始化servlet,获得servlet的初始化参数,

  此init 方法,只会在生成对象的时候调用一次,提供服务的时候不调用

3.servlet对外提供服务是调用的他的service方法,调用完成后servlet未被销毁,还继续存在于web容器中,等待其他的用户访问时候继续调用他的service方法,所有servlet的service方法是可以被多次调用的

4.只有正常关闭服务器才会调用一次servlet的destroy方法

session生命周期,

  session创建:在第一次使用resquest的getSession方法,web服务器会创建一个session

  session使用:session在服务端创建完成后,内存会给session分配一定的空间,并且会生成一个临时cookie返回给用户,当用户第二次访问的时候会带上这个临时cookie,当第二次调用resquest的getSession方法时候,由于有此临时cookie携带的sessionid就可以找到session对应的内存空间,返回此session,此后只要用户访问时带上这个临时cookie就可以获得第一次创建的session,并访问对应的内存空间

  session的销毁:

    1.默认销毁:session是有默认时长的,默认情况下,当用户三十分钟不和服务器交互数据,session就会被自动销毁,

    2.手动销毁:当调用session的invalidate方法时候会销毁此session

    3.关闭服务器:内存空间被回收了,自然就不存在session了

=============================

Session的工作原理

虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择”在新窗口中打开”时,子窗口便可以访问父窗口的Session。

如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。

注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。