`

session机制和cookie机制

    博客分类:
  • web
阅读更多
一、cookie机制和session机制的区别 ************************************************************************************* 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。 同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session 机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择 ************************************************************************************* 二、会话cookie和持久cookie的区别 ************************************************************************************* 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。   如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。   存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。 ************************************************************************************* 三、如何利用实现自动登录 *************************************************************************************   当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个 用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。 ************************************************************************************* 四、如何根据用户的爱好定制站点 *************************************************************************************   网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。 ************************************************************************************* 五、cookie的发送 ************************************************************************************* 1.创建Cookie对象 2.设置最大时效 3.将Cookie放入到HTTP响应报头 如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则 需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。 发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而非setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。 六、cookie的读取 ************************************************************************************* 1.调用request.getCookie 要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。 2.对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止  cookie与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。 例如:   String cookieName = “userID”; Cookie cookies[] = request.getCookies(); if (cookies!=null){ for(int i=0;i<cookies cookie if dosomethingwith a b c d web session id href>超文本链接并不产生表单提交,因此隐藏的表单域不能支持通常的会话跟踪,只能用于一系列特定的操作中,比如在线商店的结账过程 ************************************************************************************* 十八、会话跟踪的基本步骤 ************************************************************************************* 1.访问与当前请求相关的会话对象 2.查找与会话相关的信息 3.存储会话信息 4.废弃会话数据 ************************************************************************************* 十九、getSession()/getSession(true)、getSession(false)的区别 ************************************************************************************* getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象 getSession(false):当session存在时返回该session,否则不会新建session,返回null ************************************************************************************* 二十、如何将信息于会话关联起来 *************************************************************************************   setAttribute会替换任何之前设定的值;如果想要在不提供任何代替的情况下移除某个值,则应使用removeAttribute。这个方法会触发所有实现了HttpSessionBindingListener接口的值的valueUnbound 方法。 ************************************************************************************* 二十一、会话属性的类型有什么限制吗 ************************************************************************************* 通常会话属性的类型只要是Object就可以了。除了null或基本类型,如int,double,boolean。 如果要使用基本类型的值作为属性,必须将其转换为相应的封装类对象 ************************************************************************************* 二十二、如何废弃会话数据 ************************************************************************************* A.只移除自己编写的servlet创建的数据: 调用removeAttribute(“key”)将指定键关联的值废弃 B.删除整个会话(在当前Web应用中): 调用invalidate,将整个会话废弃掉。这样做会丢失该用户的所有会话数据,而非仅仅由我们 servlet或JSP页面创建的会话数据 C.将用户从系统中注销并删除所有属于他(或她)的会话 调用logOut,将客户从Web服务器中注销,同时废弃所有与该用户相关联的会话(每个Web应用至多一个)。这个操作有可能影响到服务器上多个不同的Web应用 ************************************************************************************* 二十三、使用isNew来判断用户是否为新旧用户的错误做法 ************************************************************************************* public boolean isNew()方法如果会话尚未和客户程序(浏览器)发生任何联系,则这个方法返回true,这一般是因为会话是新建的,不是由输入的客户请求所引起的。 但如果isNew返回false,只不过是说明他之前曾经访问该Web应用,并不代表他们曾访问过我们的servlet或JSP页面。 因为session是与用户相关的,在用户之前访问的每一个页面都有可能创建了会话。因此isNew为false只能说用户之前访问过该Web应用,session可以是当前页面创建,也可能是由用户之前访问过的页面创建的。 正确的做法是判断某个session中是否存在某个特定的key且其value是否正确 ************************************************************************************* 二十四、Cookie的过期和Session的超时有什么区别 ************************************************************************************* 会话的超时由服务器来维护,它不同于Cookie的失效日期。首先,会话一般基于驻留内存的cookie 不是持续性的cookie,因而也就没有截至日期。即使截取到JSESSIONID cookie,并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。 ************************************************************************************* 二十五、session cookie和session对象的生命周期是一样的吗 ************************************************************************************* 当用户关闭了浏览器虽然session cookie已经消失,但session对象仍然保存在服务器端 ************************************************************************************* 二十六、是否只要关闭浏览器,session就消失了 ************************************************************************************* 程序一般都是在用户做log off的时候发个指令去删除session,然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。 之所以会有这种错误的认识,是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session。 如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求报头,把原来的session id发送到服务器,则再次打开浏览器仍然能够找到原来的session。 恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。   由此我们可以得出如下结论:   关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。 ************************************************************************************* 二十七、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session ************************************************************************************* 通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的session id,这样我们信息共享的目的就达不到了。 此时我们可以先把session id保存在persistent cookie中(通过设置session的最大有效时间),然后在新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookie和persistent cookie的结合我们就可以实现了跨窗口的会话跟踪。 ************************************************************************************* 二十八、如何使用会话显示每个客户的访问次数 ************************************************************************************* 由于客户的访问次数是一个整型的变量,但session的属性类型中不能使用int,double,boolean等基本类型的变量,所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值   但像Integer是一种不可修改(Immutable)的数据结构:构建后就不能更改。这意味着每个请求都必须创建新的Integer对象,之后使用setAttribute来代替之前存在的老的属性的值。例如: HttpSession session = request.getSession(); SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”); if (value= =null){ value = new SomeImmutableClass(…); // 新创建一个不可更改对象 }else{ value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象 } session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象 ************************************************************************************* 二十九、如何使用会话累计用户的数据 ************************************************************************************* 使用可变的数据结构,比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式,除非首次分配对象,否则不需要调用setAttribute。例如 HttpSession session = request.getSession(); SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”); if(value = = null){ value = new SomeMutableClass(…); session.setAttribute(“someIdentifier”,value); }else{ value.updateInternalAttribute(…); // 如果已经存在该对象则更新其属性而不需重新设置属性 } ************************************************************************************* 三十、不可更改对象和可更改对象在会话数据更新时的不同处理 ************************************************************************************* 不可更改对象因为一旦创建之后就不能更改,所以每次要修改会话中属性的值的时候,都需要 调用setAttribute(“someIdentifier”,newValue)来代替原有的属性的值,否则属性的值不会被更新 可更改对象因为其自身一般提供了修改自身属性的方法,所以每次要修改会话中属性的值的时 候,只要调用该可更改对象的相关修改自身属性的方法就可以了。这意味着我们就不需要调 用setAttribute方法了 ************************************************************************************* </cookies>
分享到:
评论

相关推荐

    cookie机制和session机制的区别.docx

    cookie 机制和 session 机制的区别 cookie 机制和 session 机制是两种常用的Web会话跟踪机制,虽然它们都可以实现会话跟踪,但它们的实现机制和应用场景却有所不同。 首先,cookie 机制是一种客户端保持状态的方案...

    cookie机制和session机制的区别

    Cookie机制和Session机制各有优势,Cookie提供了一种轻量级的状态管理方式,适用于简单场景;而Session则提供了更安全、更强大的会话管理功能,适用于复杂的应用场景。在实际开发中,开发者应根据具体需求选择最合适...

    session机制与cookie机制(来源于IT168)

    【标题】:“session机制与cookie机制(来源于IT168)” 【描述】:这篇文章讨论了session和cookie在Web开发中的重要角色,解释了它们如何帮助维持用户状态,并且介绍了这两种机制的基本概念。 【标签】:“session...

    Cookie机制和Session机制

    ### Cookie机制和Session机制 #### 一、基本概念与背景 在现代Web应用中,为了实现用户认证、个性化设置等功能,通常需要在客户端与服务器之间维持一段时间内的状态信息。然而,HTTP协议本质上是无状态的,这意味...

    Cookie、Session机制详解.doc

    Session机制可以弥补Cookie的缺点,但是Session机制也存在一些问题,例如Session的过期问题和Session的安全性问题。 在Web应用程序中,Cookie和Session机制都是非常重要的技术,开发者需要了解这些技术的原理和优...

    cookie机制和session机制的区别.

    ### Cookie机制与Session机制的区别 #### 一、概念解析 **Cookie** 和 **Session** 是两种常见的用于在Web应用程序中维护用户状态的技术。 - **Cookie**:是一种客户端存储技术,服务器可以通过HTTP响应向客户端...

    SpringSession同时支持Cookie和header策略

    本文将深入探讨SpringSession如何支持Cookie和header策略,并解析`CookieHeaderHttpSessionStrategy.java`这个文件中的关键概念和技术细节。 首先,我们来看标题提及的“SpringSession同时支持Cookie和header策略”...

    Cookie与Session机制

    **Cookie机制** Cookie是由W3C组织提出并由Netscape社区发展起来的一种机制,现在已经成为Web应用的标准。它解决了HTTP协议无状态的问题,使得服务器能够识别和跟踪用户会话。Cookie本质上是文本信息,通常由服务器...

    Cookie与session机制详解

    ### Cookie与Session机制详解 #### 一、Cookie与Session的概念及区别 在Web开发中,为了保持用户的状态信息,通常会用到两种技术:Cookie和Session。这两种技术都是用来跟踪用户的浏览活动,但它们的工作原理有所...

    经典收藏Cookie和Session

    #### 一、Cookie机制与Session机制的区别 在Web开发中,为了维持用户的会话状态,通常有两种常用的技术:Cookie与Session。这两种技术各有特点,适用于不同的场景。 - **Cookie**: - **定义**:Cookie是一种存储...

    Cookie与Session机制.doc

    Cookie 机制和 Session 机制都是常用的会话跟踪技术。但是,它们有着不同的特点和应用场景。Cookie 机制适合于小规模的应用程序,例如记录用户的访问次数等。Session 机制适合于大规模的应用程序,例如购物网站中的...

    Cookie-Session机制详解.docx

    Cookie 和 Session 机制都是 Web 程序中常用的技术,用来跟踪用户的整个会话。Cookie 通过在客户端记录信息确定用户身份,而 Session 通过在服务器端记录信息确定用户身份。虽然两种机制都有其优点和缺点,但是它们...

    session 和cookie 区别

    标题与描述中的关键词“session和cookie区别”指向了两种在Web开发中常用的状态管理技术,它们各自具有独特的特性和用途。下面将详细阐述这两种技术的关键知识点: ### session和cookie的区别 **1. 定义与存储位置...

    Cookie、Session和Token三者的区别及使用

    ### Cookie、Session与Token的区别及使用详解 #### 一、Cookie **定义**: Cookie是一种用于在客户端保持状态的方案。简单来说,当你访问一个网站时,该网站可能会在你的计算机上留下一些信息(如用户名、密码等),...

    cookie和session示例

    在Web开发中,Cookie和Session是两种非常重要的用户状态管理机制。它们被广泛用于跟踪用户的登录状态、个性化设置等,确保用户在不同页面之间切换时能够保持一致性体验。接下来,我们将详细探讨Cookie和Session的...

    TP5 Session和Cookie

    同时,ThinkPHP5提供了丰富的中间件(Middleware)机制,可以方便地处理Session和Cookie的生命周期,如自动启动Session、加密Cookie值等。中间件是框架处理请求和响应流程中的拦截器,可以在请求进入控制器之前或...

    flask-session-cookie-manager-master.zip

    在Flask中,默认的session机制是基于cookies的,这意味着session ID被存储在用户的cookie中。当用户向服务器发送请求时,服务器会根据这个ID查找对应的session数据。然而,这种机制存在一定的风险,如session劫持、...

Global site tag (gtag.js) - Google Analytics