zoukankan      html  css  js  c++  java
  • Session的生命同期

    一、什么是Session,怎么用

      Session是存放用户与web服务器之间的会话,即服务器为浏览器开辟的存储空间。

      由于浏览器与服务器之间的会话是无状态(无状态的意思是会话之间无关联性,无法识别该用户曾经访问过)的机制,Session则可用于关联访问,因此多用与用户登录等功能上。

      服务器端获取Session中的值方法:

    1 //通过request来获取Session对象
    2 //通过session对象的setAttribute(k,v)方法将值保存到Session中
    3 request.getSession().setAttribute("key","value");
    4 
    5 //通过session对象的getAttribute(key)来获取Session中的值
    6 request.getSession().getAttribute("key");

       Session存在是为了提高安全性,因为Session是存放在服务器上的,与Cookies不同,Cookies存放在客户端浏览器中。因此cookie是较为危险的,若客户端遭遇黑客攻击,信息容易被窃取,数据也可能被篡改,而运用Session可以有效避免这种情况的发生。

    二、Session的生命周期

      1.什么时候生效

        当浏览器第一次访问服务器的时候创建    //注:当只有访问动态资源的时候才会创建,如 jsp、Servlet。访问静态资源的时候并不会创建,如 image、html,但是可以通过request.getSession(true)强制创建Session。

      2.什么时候失效

        1)服务器会将长时间不活动的Session强制清除掉,此时就会失效。Tomcat中的Session有效时间默认为30分钟。

        2)通过调用invalidate方法,使服务器端的所有Session全部失效。request.getSession().invalidate();

      3.失效是从什么时候开始的。

        是从Session不活动的时候开始计时,如果达到了失效时间,那么会清掉Session。一旦Session被访问,计时就会清0。

      4.设置Session失效时间

        1.web.xml中设置

    1 <session-config>
    2     //当timeout设置为-1时,表示永不过期
    3     <session-timeout>30</session-timeout>
    4 </session-config>

        2.在程序中设置

          request.getSession.setMaxInactiveInterval(-1)    //注:-1表示永不过期,值单位为秒30分钟(30*60)

        3.在Tomcat中的Context设置过默认过期时间

    1 <Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true"   isWorkDirPersistent="false"/>

    三、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了。

  • 相关阅读:
    浅谈工业无线技术之天线
    防护等级
    PROFINET如何实现实时性
    2020,我又回来了
    关于ReentrantLock和Condition的用法
    当你在试衣间试衣服,请你务必想起wait()与notify()
    用生活例子来解释Java synchronized块
    关于textview显示特殊符号居中的问题
    扯一扯我的2016
    国庆的这6天
  • 原文地址:https://www.cnblogs.com/EmilZs/p/10500422.html
Copyright © 2011-2022 走看看