`
uule
  • 浏览: 6351989 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

session总结

阅读更多

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

5.2.1  什么是Session
Session是另一种记录客户状态的机制,不同的是
Cookie保存在客户端浏览器中,而Session保存在服务器上 。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的"通行证"来确定客户身份的话,那么Session机制就是通过检查服务器上的"客户明细表"来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。


5.2.2  实现用户登录

Session对应的类为javax.servlet.http.HttpSession类。每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。Session对象是在客户端第一次请求服务器的时候创建的。Session也是一种key-value的属性对,通过getAttribute(String key)和setAttribute(String key,Object value)方法读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的Session


5.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)"了一次。


5.2.4  Session的有效期

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

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

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



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


5.2.7  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了。


http://book.51cto.com/art/200912/169764.htm

 



session的默认过期时间是20,可修改的最大时间是1440,可以在全局应用程序类中的void Session_Start(object sender, EventArgs e) 事件中用session.timeout设置过期时间


要知道session 原理以及生命周期
1:session 是通过浏览器的cookie来保存一个jessionid的信息 。这个jsessionid里面包含着你session 的id 。正是通过这个jessionid浏览器才能判断是不同用户的session ,用户每次进行session.getAttribute()或则 session.setAttribute时候。都会取出jesseionid里面的信息和session id比较。来区分不通的session。
2.session 的生命周期是一次会话。就是从用户开始请求这个application开始到application结束。 你停止了服务当然这个应用也就结束。tomcate容器出清除session

一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存 到硬盘上。
你可以设置session的持久化特性试试看,当服务器进程重新启动或这些信息将能够被再次使用。
tomcat 正常关闭或者 restart 的话 tomcat 会在 work 的这个工程目录下有个 session.ser 文件,会保存在那里,重启时会重新加载。

默认的Tomcat是支持Session持久化的。当然,取消注释也就取消了这个功能。
conf/context.xml:
<Manager pathname="" />  .

Servlet容器通过在客户端浏览器中保存一个Session ID来跟踪Session,调用session.getID()可以看到你的Session ID是多少。如果客户端支持Cookie,就把Session ID作为Cookie保持在浏览器中,现在绝大多数浏览器都会把Cookie功能打开,但如果用户禁止了Cookie呢?Java Servlet API中提出了另外一种机制,Servlet容器可以重写客户requst的URL,把Session ID添加到URL信息中,HttpServletResponse接口提供了这样的方法:public String encodeURL(String url)-先判断如果没有启用Session,例如jsp中<%@ page session="false"%>或执行了session.invalideate(),那么直接返回url,在判断客户端师父支持 Cookie,如果不支持,就在url中加入Session ID的信息,然后返回修改后的url。

Session的管理
当一个sesson开始时,Servlet容器会创建一个HttpSession对象,在某些情况下把这些Httpsession对象从内存中转移到文件系统中或数据库中,需要访问的时候在把它们载入到内存中来。这样做的好处有两点:节约了内存的消耗,当web服务器产生故障时,还可以从文件系统或数据库中恢复Session的数据。

关闭浏览器并不销毁session,
只是打开新页面或提交新请求时,
获得是一个新的session,
而找不到原来的SESSION。

每个session都有个session id,
如果新的页面或新的请求附带着原来的SESSION ID,
那么就会找到之前的SESSION。
形如:
request.getContextPath()/login.do?jsessionid=XXXXXX

分享到:
评论

相关推荐

    Jsp内置对象session总结

    JSP 内置对象 Session 总结 Session 对象是一种 JSP 内置对象,用于管理客户端与服务器端之间的会话期。下面是 Session 对象的详细介绍。 什么是 Session Session 对象是一个 JSP 内置对象,它在第一个 JSP 页面...

    spring session redis分布式session

    **总结** Spring Session结合Redis为分布式系统提供了一种高效、可靠的Session管理方式。通过自定义Session,我们可以根据业务需求调整Session的行为,确保在复杂环境下满足系统的稳定性和可扩展性。在实际项目中,...

    js操作session例子

    总结起来,JavaScript操作Session的关键在于利用表单提交或Ajax通信与服务器进行交互。虽然JS直接修改服务器端Session有困难,但通过以上方式可以巧妙地实现数据在客户端和服务器之间的传递,从而达到管理Session的...

    Spring Session + redis实现session共享

    总结起来,Spring Session与Redis的结合为分布式环境下的session共享提供了强大而灵活的解决方案。通过将session数据存储在Redis中,我们可以轻松地扩展Web应用的服务器集群,同时保持用户状态的一致性。了解并熟练...

    session共享 memcached-session-manager 1.9.6 jar

    总结来说,`memcached-session-manager`是一个用于在Tomcat环境中实现基于Memcached的session共享的工具,版本1.9.6已被证实兼容Tomcat 7和8,并且能有效支持负载均衡。它利用Kryo等高效序列化库,优化了session在...

    SpringSession+Redis实现Session共享案例

    总结,`SpringSession+Redis`的组合为分布式环境下的Session共享提供了强大而灵活的解决方案。通过理解并掌握这两个技术的原理和配置,开发者可以轻松地在多服务器之间共享用户状态,提升系统的整体性能和用户体验。

    Hibernate-nosession

    总结来说,Hibernate-nosession是一种优化策略,它适合于那些对性能要求较高且不涉及复杂业务逻辑的场景。通过避免频繁打开和关闭Session,可以减少资源消耗,提高系统的响应速度。在实际开发中,我们需要根据项目...

    Session丢失原因和解决方案

    总结来说,理解ASP.NET Session的工作原理和潜在的丢失原因,以及掌握相应的解决策略,是提高Web应用程序稳定性和用户体验的关键。通过选择合适的Session存储模式、优化配置以及正确处理对象序列化,可以有效地避免...

    针对负载均衡集群中的session解决方案的总结

    本文主要针对负载均衡集群中的session解决方案进行总结性说明.

    前端session存储数据

    总结来说,JavaScript Session是前端开发中管理用户会话的关键技术,通过Cookie或Local Storage在客户端存储数据,以适应单页面应用程序的需求。开发者可以根据应用场景和安全性需求选择合适的方式来实现和维护用户...

    退出页面自动清除session技巧

    根据提供的内容,我们可以总结出两种主要方式来清除Session: 1. **使用`removeAttribute()`方法移除Session中的特定属性** 如果只需要移除Session中的某个特定属性(比如用户名),可以使用`removeAttribute()`...

    请问ASPX中如何读取SESSION变量

    ### 总结 在ASP.NET中使用`Session`变量时,需要注意几个关键点: 1. **初始化**:确保在使用前已正确初始化。 2. **类型检查**:对于从`Session`对象中读取的数据,进行类型检查可以避免运行时错误。 3. **跨页面...

    session之用户交互间隔&&session持久化

    ### 五、总结 本文详细介绍了 Session 在 Web 开发中的作用、Tomcat 中 Session 的管理方式、Session 的持久化机制以及如何计算用户交互间隔等知识点。通过理解这些内容,开发者可以更好地管理和优化 Web 应用中的 ...

    详解php设置session(过期、失效、有效期)

    总结来说,理解并灵活运用PHP的Session设置至关重要,它涉及到Session数据的存储位置、过期策略以及在多服务器环境下的管理。通过正确配置和编程技巧,开发者可以有效地控制Session的生命周期,从而优化用户体验和...

    java中使用session模拟用户登陆

    总结,Java中的Session是Web开发中重要的用户状态管理工具,它帮助我们在服务器端保持对用户登录状态的跟踪,确保了用户交互过程中的个性化服务。在实际应用中,需要注意合理配置和安全使用Session,以提高应用的...

    ubuntu自定义登录session和桌面环境

    总结来说,自定义Ubuntu的登录Session和桌面环境涉及到对Session配置文件的编辑、设置自动登录以及选择合适的桌面组件。通过这样的定制,用户可以根据自己的工作习惯和喜好打造出独一无二的操作系统体验。在遇到问题...

    asp.net c# 在类中使用session的方法

    在ASP.NET中,Session是一...### 四、总结 在ASP.NET C#应用中,熟练掌握在类中使用Session的方法,能够显著提升应用的功能性和用户体验。通过遵循上述步骤和最佳实践,开发者可以构建更加健壮、安全和高效的Web应用。

    IIS7 Session的方法

    总结来说,理解并熟练掌握IIS7中的Session管理方法对开发高效、可靠的Web应用程序至关重要。根据具体的应用场景和需求,合理选择Session的存储模式,优化Session的使用,可以提升Web应用的性能和用户体验。

    session_test.zip

    在Java Web开发中,Session是...总结一下,Session是Java Web中用来跟踪用户状态的重要工具,通过Session可以在多个请求之间保持用户登录状态。开发者需要合理地创建、管理和使用Session,以确保应用的安全性和性能。

    session的用法

    6. **总结** - Session机制是Web开发中不可或缺的一部分,它允许开发者创建个性化的用户体验,同时带来了状态管理的挑战。理解Session的工作原理,并熟练掌握其在Java Web中的应用,对于构建高效、安全的Web应用至...

Global site tag (gtag.js) - Google Analytics