`

[转]Session,Cookie 应用

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

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

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


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

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

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


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

表5.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的超时时间。单位为秒

void putValue(String attribute, Object value)
不推荐的方法。已经被setAttribute(String attribute, Object Value)替代

Object getValue(String attribute) 不被推荐的方法。已经被getAttribute(String attr)替代

boolean isNew() 返回该Session是否是新创建的

void invalidate() 使该Session失效


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

<session-config>    
<session-timeout>60</session-timeout>       <!-- 单位:分钟 -->
</session-config>
注意:<session-timeout>参数的单位为分钟,而setMaxInactiveInterval(int s)单位为秒。

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

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

<td>      <a href="<%= response.encodeURL("index.jsp?c=1&wd=Java") %>">       Homepage</a> </td> 该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。重写后的输出可能是这样的:

<td>      <a href="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=       1&wd=Java">Homepage</a> </td> 即在文件名的后面,在URL参数的前面添加了字符串";jsessionid=XXX"。其中XXX为Session的id。分析一下可以知道,增添的jsessionid字符串既不会影响请求的文件名,也不会影响提交的地址栏参数。用户单击这个链接的时候会把Session的id通过URL提交到服务器上,服务器通过解析URL地址获得Session的id。

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

<%      if("administrator".equals(userName)){          response.sendRedirect(response.encodeRedirectURL("administrator.jsp"));          return;      } %> 效果跟response.encodeURL(String url)是一样的:如果客户端支持Cookie,生成原URL地址,如果不支持Cookie,传回重写后的带有jsessionid字符串的地址。

对于WAP程序,由于大部分的手机浏览器都不支持Cookie,WAP程序都会采用URL地址重写来跟踪用户会话。比如用友集团的移动商街等。

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


Session中禁止使用Cookie

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

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

代码5.11 /META-INF/context.xml

<?xml version='1.0' encoding='UTF-8'?> <Context path="/sessionWeb" cookies="false"> </Context> 或者修改Tomcat全局的conf/context.xml,修改内容如下:

代码5.12 context.xml

<!-- The contents of this file will be loadedfor each web application --> <Context cookies="false">      <!-- ... 中间代码略 --> </Context> 部署后TOMCAT便不会自动生成名JSESSIONID的Cookie,Session也不会以Cookie为识别标志,而仅仅以重写后的URL地址为识别标志了。

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


Session与Cookie的比较

Cookie与Session都可以进行会话跟踪,但是实现的原理不太一样。一般情况下二者均可以满足需求,但有时候不可以使用Cookie,有时候不可以使用Session。下面通过比较说明二者的特点以及适用的场合。

5.3.1 从存取方式上比较

Cookie中只能保存ASCII字符串,如果需要存取Unicode字符或者二进制数据,需要进行UTF-8,GBK或者BASE64等方式的编码。Cookie中也不能直接存取Java对象。若要存储稍微复杂的信息,使用Cookie是比较困难的。

而Session中可以存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也可以直接保存Java Bean乃至任何Java类,对象等,使用起来非常方便。可以把Session看做是一个Java容器类。

从隐私安全上比较

Cookie存储在客户端浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制甚至修改Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的危险。

如果选用Cookie,比较好的办法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只有自己能读得懂。而如果选择Session就省事多了,反正是放在服务器上,Session里任何隐私都可以。


从有效期上比较

使用过Google的人都知道,如果登录过Google,则Google的登录消息长期有效。用户不必每次访问都重新登录,Google会长久地记录该用户的登录信息。要达到这种效果,使用Cookie会是比较好的选择。只需要设置Cookie的maxAge属性为一个很大很大的数字或者Integer.MAX_VALUE就可以了。Cookie的maxAge属性支持这样的效果。

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

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


从对服务器的负担上比较

Session是保存在服务器端的,每个用户都会产生一个Session。如果并发访问的用户非常多,会产生非常多的Session,消耗大量的内存。因此像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能使用Session来追踪客户会话的。

而Cookie保存在客户端,不占用服务器资源。如果并发浏览的用户非常多,Cookie是很好的选择。对于Google、Baidu、Sina来说,Cookie也许是唯一的选择。

从浏览器支持上比较

Cookie是需要客户端浏览器支持的。如果客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失效。对于WAP上的应用,常规的Cookie就派不上用场了。

如果客户端浏览器不支持Cookie,需要使用Session以及URL地址重写。需要注意的是所有的用到Session程序的URL都要使用response.encodeURL(String URL)或者response.encodeRedirectURL(String URL)进行URL地址重写,否则导致Session会话跟踪失败。对于WAP应用来说,Session+URL地址重写也许是它唯一的选择。

如果客户端支持Cookie,则Cookie既可以设为本浏览器窗口以及子窗口内有效(把maxAge设为-1),也可以设为所有浏览器窗口内有效(把maxAge设为某个大于0的整数)。但Session只能在本浏览器窗口以及其子窗口内有效。如果两个浏览器窗口互不相干,它们将使用两个不同的Session。


从跨域名上比较

Cookie支持跨域名访问,例如将domain属性设置为".helloweenvsfei.com",则以".helloweenvsfei.com"为后缀的所有域名均可以访问该Cookie。跨域名Cookie现在被广泛用在网络中,例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。

注意:仅使用Cookie或者仅使用Session可能实现不了理想的效果。这时应该尝试一下同时使用Cookie与Session。Cookie与Session的搭配使用在实际项目中会实现绚烂多姿的效果。


本章小结

Cookie是早期的会话跟踪技术,它将信息保存到客户端浏览器中。浏览器访问网站时会携带这些Cookie信息,达到鉴别身份的目的。

Session是在Cookie基础上建立的会话跟踪技术,它将信息保存在服务器端,Session中能够存储负责的Java对象,因此使用更加方便。Session依赖于名为JSESSIONID的Cookie。

如果客户端浏览器不支持Cookie,或者禁用了Cookie,仍然可以通过使用URL地址重写来使用Session。

摘自:http://hi.baidu.com/egretsoft/blog/item/a21fe9df118987d58c102961.html
分享到:
评论

相关推荐

    javaweb之cookie和session的应用

    本文将深入探讨Cookie和Session的工作原理、应用场景以及如何在Java Web项目中进行有效利用。 **Cookie** Cookie是由服务器端发送到客户端(浏览器)的一小段文本信息,用于在客户端和服务器之间传递状态信息。它...

    flask-session-cookie-manager

    标题“flask-session-cookie-manager”指的是一个Python应用,它专门针对Flask框架,用于管理和操作session cookie。在Web开发中,session cookie是服务器用来跟踪用户状态的一种方式,特别是在无状态的HTTP协议上...

    asp.net的session和cookie的应用

    总的来说,ASP.NET的Session和Cookie是构建动态Web应用的重要工具。正确理解和使用它们能够提升用户体验,同时要考虑到性能和安全性的平衡。在设计Web应用时,根据需求选择合适的状态管理策略是至关重要的。

    Cookie,Session,Application的区别与应用

    ### Cookie、Session、Application 的区别与应用 在 ASP.NET 中,为了存储用户的状态信息或临时数据,开发人员经常使用多种内置的对象,例如 Application、Session、Cookie、ViewState 和 Cache 等。这些对象各有...

    session 和cookie 区别

    标题与描述中的关键词“session和cookie区别”指向了两种在Web开发中常用的状态...总之,session和cookie在Web开发中扮演着重要角色,了解它们的区别和使用场景对于构建安全、高效、用户友好的Web应用程序至关重要。

    flask、session、cookie解加密脚本

    这些脚本可能用来检查或调试`Flask`应用的`session`和`cookie`管理,或者用于演示如何手动解密和操作这些数据。 `setup.py`文件通常用于定义一个Python项目的安装配置,这可能是为了将这些解密脚本打包成可安装的...

    flask-session-cookie-manager-master.zip

    综上所述,“flask-session-cookie-manager-master”是一个针对Flask的session管理工具,重点关注session的安全加密和解密,旨在提高Web应用在CTF竞赛或实际开发中的安全性。通过研究和使用这个工具,我们可以深入...

    经典收藏Cookie和Session

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

    session与cookie的区别和联系?

    3. **共同目标**:虽然Session和Cookie有不同的特性和应用场景,但它们的共同目标都是为了保持用户的会话状态,提高用户体验。 #### 四、实际应用案例 假设一个在线购物网站: - 用户登录后,服务器为该用户创建...

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

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

    j2ee实验二:学习使用Session和Cookie

    通过本实验的学习,学生不仅掌握了Session和Cookie的基本概念和用法,还能够独立开发简单的Web应用。这些技能对于从事Web开发工作来说是非常宝贵的。此外,通过实践操作加深了对B/S架构的理解,为将来进一步探索复杂...

    一次搞明白 Session、Cookie、Token,面试问题全搞定.pdf

    总结来说,Session、Cookie和Token都是Web应用中用于保持用户状态的机制,但它们的工作原理和应用场景各有不同。Session在服务器端保存用户状态,而Cookie和Token则将用户状态保存在客户端。了解这些机制的优缺点,...

    JAVA之cookie与session

    ### JAVA之cookie与session #### 一、Cookie与Session的概念 **Cookie** 与 **Session** 是两种...在实际开发过程中,合理利用 Cookie 和 Session 的特性,可以有效提升用户体验,同时确保应用程序的安全性和稳定性。

    SpringSession同时支持Cookie和header策略

    SpringSession的实现允许自定义Cookie的名称、过期时间以及安全性设置,以适应不同的应用场景。 而header策略则是将session ID放入HTTP请求的头部,比如X-Auth-Token或类似的自定义头部。这种方法可以避免Cookie的...

    cookie和session示例

    接下来,我们将详细探讨Cookie和Session的工作原理、特点以及如何在实际应用中使用它们。 一、Cookie 1. 工作原理: Cookie是由服务器端发送到客户端(浏览器)的一小段文本信息,当客户端后续向服务器发送请求时...

    session cookie asp.net

    ASP.NET中的Session和Cookie是两种常见的用户状态管理技术。在Web应用中,由于HTTP协议的无状态特性,服务器无法直接识别连续的请求来自同一个用户,因此需要借助这些机制来跟踪用户的状态。 Session和Cookie的主要...

    c#实现cookie和session的登陆实例

    在Web开发中,Cookie和Session是两种常见的用户身份验证机制,尤其在C#编程语言中,它们被广泛用于实现登录功能。本实例将探讨如何在C#环境下利用Cookie和Session来处理用户登录状态。 首先,我们要理解Cookie和...

    PHP创建和使用session cookie变量

    在实际应用中,可以根据需要选择使用 Session 或 Cookie。例如,在需要高度安全性的场景下,通常会使用 Session;而在需要存储少量数据且不涉及敏感信息的情况下,可以使用 Cookie。 综上所述,Session 和 Cookie ...

    cookie和session

    本文将详细解析Cookie与Session的工作原理、区别及应用场景。 #### 一、Cookie与Session的基本概念 **Cookie**:是一种简单的客户端存储技术,用于保存用户的偏好设置、登录状态等信息。当用户访问网站时,服务器...

    Session&Cookie;.rar

    - **设计网页皮肤**:利用Session或Cookie存储用户选择的主题或布局,每次用户访问时读取并应用。 - **自动登录**:通过记住密码功能,将加密后的凭据存入Cookie,下次访问时自动填充表单。 - **控制登录时间**:...

Global site tag (gtag.js) - Google Analytics