• Session机制和类函数


    1.2 Session机制

      除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力

    1.2.1 什么是Session

      Session是另一种记录客户状态的机制,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

      如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

    1.2.2 实现用户登录

      Session对应的类为 javax.servlet.http.HttpSession 类。每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。Session对象是在客户端第一次请求服务器的时候创建的。

      Session也是一种key-value的属性对,通过getAttribute(Stringkey)setAttribute(String key, Objectvalue)方法读写客户状态信息。Servlet里通过 request.getSession() 方法获取该客户的Session,例如:

    1 HttpSession session = request.getSession(); //获取Session对象
    2 session.setAttribute("loginTime", new Date()); //设置Session中的属性

      request还可以使用 getSession(boolean create) 来获取Session。区别是如果该客户的Session不存在,request.getSession() 方法会返回null,而getSession(true)会先创建Session再将Session返回。

      Servlet中必须使用request来编程式获取HttpSession对象,而JSP中内置了Session隐藏对象,可以直接使用。如果使用声明了<%@page session="false" %>,则Session隐藏对象不可用。

    注意:当多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见

    提示:Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力。

    1.2.3 Session的生命周期

      Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

      Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

      Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

    1.2.4 Session的有效期

      由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

      Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval() 获取,通过 setMaxInactiveInterval(longinterval) 修改。

      Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。

    1.2.5 Session的常用方法

      Session中包括各种方法,使用起来要比Cookie方便得多。Session的常用方法如表1.2所示。

    表1.2  HttpSession的常用方法

    void setAttribute(String  attribute, Object value) 设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大
    String getAttribute(String attribute) 返回Session属性
    Enumeration getAttributeNames() 返回Session中存在的属性名
    void removeAttribute(String attribute) 移除Session属性
    String getId() 返回Session的ID。该ID由服务器自动创建,不会重复
    long getCreationTime() 返回Session的创建日期。类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.getCreationTime())
     long getLastAccessedTime() 返回Session的最后活跃时间。返回类型为long 
     int getMaxInactiveInterval 返回Session的超过时间。单位为秒。超过该时间没有访问,服务器认为该Session失效 
     void setMaxInactiveInterval(int second)  设置Session的超时时间。单位为秒
     boolean isNew()  返回该Session是否是新创建的
     void invalidate()  使该Session失效

    Tomcat中Session的默认超时时间为20分钟。通过setMaxInactiveInterval(int seconds)修改超时时间。可以修改web.xml改变Session的默认超时时间。例如修改为60分钟

    1 <session-config>
    2 
    3    <session-timeout>60</session-timeout>      <!-- 单位:分钟 -->
    4 
    5 </session-config>

    1.2.6 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地址重写。

    1.2.7 URL地址重写

      URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写,例如:

    1 <td>
    2 
    3     <a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>"> 
    4     Homepage</a>
    5 
    6 </td>

      该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。重写后的输出可能是这样的:

    1 <td>
    2 
    3     <ahref="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=
    4     1&wd=Java">Homepage</a>
    5 
    6 </td>

      即在文件名的后面,在URL参数的前面添加了字符串“;jsessionid=XXX”。其中XXX为Session的id。分析一下可以知道,增添的jsessionid字符串既不会影响请求的文件名,也不会影响提交的地址栏参数。用户单击这个链接的时候会把Session的id通过URL提交到服务器上,服务器通过解析URL地址获得Session的id。

    如果是页面重定向(Redirection),URL地址重写可以这样写:

     1 <%
     2 
     3     if(“administrator”.equals(userName))
     4 
     5     {
     6 
     7        response.sendRedirect(response.encodeRedirectURL(“administrator.jsp”));
     8 
     9         return;
    10 
    11     }
    12 
    13 %>

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

    1.2.8 Session中禁止使用Cookie

      既然WAP上大部分的客户浏览器都不支持Cookie,索性禁止Session使用Cookie,统一使用URL地址重写会更好一些。Java Web规范支持通过配置的方式禁用Cookie。下面举例说一下怎样通过配置禁止使用Cookie。

      打开项目sessionWeb的WebRoot目录下的META-INF文件夹(跟WEB-INF文件夹同级,如果没有则创建),打开context.xml(如果没有则创建),编辑内容如下:

    代码1.11 /META-INF/context.xml

    1 <?xml version='1.0' encoding='UTF-8'?>
    2 
    3 <Context path="/sessionWeb"cookies="false">
    4 
    5 </Context>

    或者修改Tomcat全局的conf/context.xml,修改内容如下:

    代码1.12  context.xml

    1 <!-- The contents of this file will be loaded for eachweb application -->
    2 
    3 <Context cookies="false">
    4 
    5     <!-- ... 中间代码略 -->
    6 
    7 </Context>

    部署后TOMCAT便不会自动生成名JSESSIONID的Cookie,Session也不会以Cookie为识别标志,而仅仅以重写后的URL地址为识别标志了。

    注意:该配置只是禁止Session使用Cookie作为识别标志,并不能阻止其他的Cookie读写。也就是说服务器不会自动维护名为JSESSIONID的Cookie了,但是程序中仍然可以读写其他的Cookie。

     

    参考链接:https://www.cnblogs.com/l199616j/p/11195667.html

  • 相关阅读:
    20155313 杨瀚 《网络对抗技术》实验九 Web安全基础
    20155313 杨瀚 《网络对抗技术》实验八 Web基础
    20155313 杨瀚 《网络对抗技术》实验七 网络欺诈防范
    20155313 杨瀚 《网络对抗技术》实验六 信息搜集与漏洞扫描
    20155313 杨瀚 《网络对抗技术》实验五 MSF基础应用
    20155313 杨瀚 《网络对抗技术》实验四 恶意代码分析
    20155313 杨瀚 《网络对抗技术》实验三 免杀原理与实践
    20155313 杨瀚 《网络对抗技术》实验二 后门原理与实践
    20155313 杨瀚 《网络对抗技术》实验一 PC平台逆向破解(5)M
    20155313 2017-2018-1 《信息安全系统设计基础》课程总结
  • 原文地址:https://www.cnblogs.com/john1015/p/13743939.html
Copyright © 2020-2023  润新知