zoukankan      html  css  js  c++  java
  • cookie和session的区别与会话跟踪技术

    会话跟踪技术:

    HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的、非连续的。当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以解决这个问题。当一个客户在多个页面间切换时,服务器会保存该用户的信息。

    有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。

    1).隐藏表单域:通常,在表单中我们使用隐藏表单域的时候会有这么一句代码:<input type=”hidden” name=”XXX”  value=”XXX”/>。通过给type属性赋值为hidden值来实现隐藏,这样用户在浏览的时候看不到这行代码的数据,但是当用户通过查看 源代码还是可以看到的。仅当每个页面都是由表单提交而动态生成时,才能使用这种方法

    2).URL 重写:URL重用户在每个URL结尾附加标识回话的数据,与标识符关联的服务器保存有关与会话的数据,如我们访问某个新闻的时候,在地址栏我们一般会看到这样的 信息:http://www.XXX.com/news?id=??,通常的话id后面的问号表示该条新闻在后台数据库中的新闻表的id。URL重写能够 在客户端停用cookies或者不支持cookies的时候仍然能够发挥作用。

    3).Cookie:服务器使用 SET-Cookie 头标将它作为 HTTP响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它仍可以保留其值。Cookies是使用最广泛的会话跟踪机制,Cookies是由服务器创建,并把Cookies信息保存在用户机器上的硬盘上,下次用户再次访问该站点服 务器的时候,保存在用户机器上硬盘Cookies信息就被送回给服务器。一般Cookies一般不多于4KB,且用户的敏感信息如信用卡账号密码不应该 保存在Cookies中

    要达到长久地记录用户的登录信息的效果,使用Cookie会是比较好的选择。只需要设置Cookie的maxAge属性为一个很大很大的数据字或者Integer.MAX_VALUE就可以了。Cookie的maxAge属性支持这样的效果。

    分为内存cookie和磁盘cookie。内存cookie在浏览器关闭后消失,磁盘cookie超时后消失。当浏览器发送请求时,将自动发送对应cookie信息,前提是请求url满足cookie路径;

    session和cookie的区别:http://blog.csdn.net/duan1078774504/article/details/51912868,详解:https://www.cnblogs.com/linguoguo/p/5106618.html

    4).Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话。慎用,因为这种机制是把Session信息保存在服务器端,如果访问量特别大的话,对于服务器的压力很大。。

    使用Session理论上也能实现这种效果。只要调用方法setMaxInactiveInterval(Integer.MAX_VALUE)不就可以了么。但是由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的maxAge默认为-1,关闭了浏览器该客户端的Session就会失效,因此Session不能实现信息永久有效的效果

    而且如果设置Session的超时时间过长,服务器累计的Session就会越多,越容易导致内存溢出。

     

    一个 session,对应一个 sessionID。一般tomcat设定session生命周期为30分钟,超时将失效,也可以主动设置无效;tomcat的session的id值生成的机制是一个随机数加时间加上jvm的id值,jvm的id值会根据服务器的硬件信息计算得来,因此不同jvm的id值都是唯一的。

    session如何产生:

    在Java中,HTTP的Session对象用javax.servlet.http.HttpSession来表示,当某server端程序(如servlet)调用HttpSession session = HttpServletRequest.getSession(true)时才被创建。
    1)getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象。
    2)getSession(false):当session存在时返回该session,否则不会新建session,返回null。
     
     
    Session删除的时间是:
    1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
    2)程序调用HttpSession.invalidate()
    3)服务器关闭或服务停止
     【关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务端的session对象失效】
     
    同一客户端机器多次请求同一个资源,session一样吗?
    一般来说,每次请求都会新创建一个session。
     
    其实,这个也不一定的,总结下:对于多标签的浏览器(比如360浏览器)来说,在一个浏览器窗口中,多个标签同时访问一个页面,session是一个。对于多个浏览器窗口之间,同时或者相隔很短时间访问一个页面,session是多个的,和浏览器的进程有关。对于一个同一个浏览器窗口,直接录入url访问同一应用的不同资源,session是一样的。
     
     
    其实,session的创建和使用总在服务端,而浏览器从来都没得到过session对象。但浏览器可以请求Servlet(jsp也是Servlet)来获取session的信息。客户端浏览器真正拿到的是session ID,而这个对于浏览器操作的人来说,是不可见的,并且用户也无需关心自己处于哪个会话过程中。
     
    session在客户端的存在方式:
    1.借助于cookie,将sessionID存在cookie中。
    2.URL重写(get),将sessionID直接附在URL后面,即JSESSIONID=...
    3.隐藏表单域(post)。
     
     
  • 相关阅读:
    34、JS/AJAX
    33、mybatis(二)
    32、mybatis
    31、springmvc(注解)
    30、springmvc
    29、Oralce(五)
    Spring学习之路-SpringBoot简单入门
    Spring学习之路-从放弃到入门
    心情日记
    Spring学习之路-从入门到放弃
  • 原文地址:https://www.cnblogs.com/cing/p/8622633.html
Copyright © 2011-2022 走看看