在J2EE的开发与之用中,session所起到的作用是有目共睹的。它所能方便我们与服务器之间进行会话,就好像人与人之间交流一样。一个会话用一个session来表示,这样就可以保证服务器不会被忙晕了。谈到session,就很容易让人产生一个误区,那就是:是不是我开一个页面就有一个会话?如果我关掉了与服务器之间的会话(通常是以关掉浏览器的方式来实现)我的这个session就相应的不存在了?是不是有了session,服务端就知道我在干什么(因为只有这样他才知道我想要什么)?
由于日常的习惯和一些惯性思维,就很容易涉入这些误区。其实事实并非如此。
在B/S(浏览器/服务器)体系里面,实现服务端与客户端通信的,的确是采取一个用户一个session的方式,用户通过在浏览器端的一些动作来达到与服务器的“交流”,似乎服务器能知道我在做什么似的。其实不然。我们的浏览器大多数都是支持W3C标准的,http协议都是以无状态的形式存在,而服务端是时刻都在“活动”,真正实现浏览器与服务端通信的其实是请求的提交。服务端则根据请求URL的不同响应不同的内容。也就是说,如果浏览器没有发出请求,服务端是不知道用户在做什么的。Session是驻留在服务端内存当中的,记录了客户端的一些基本信息。
由于必须为每个session都分配相应的内存资源,这就要求有条件的去限制session的数量。试想一下,如果平均一个session占1M的内存,那么当同时在线的用户很多的时候我们的服务器可能会崩溃掉。所有要采取很多种方法去尽量减轻服务器端的压力。
那么浏览器是怎么知道我的这个session的呢?当用户向服务端提交一个请求之后,服务会自动为它分配一个唯一的session标示id。然后通过response响应到用户的浏览器,在存储在用户浏览器的cookie中,只要用户打开网页的方式是采取window.open的方式,而不是,直接打开新的浏览器,他的这个session id是多页面共用的。当然,有很多浏览器的cookie为了考虑安全性而禁掉。虽然有的浏览器会自动去开,但是并不是全部。为了考虑更好的兼容性,可以将这个session的id采取在URL后面加上?jsessionid的方式带上,这样就确保了用户会话的流畅性。
那么,当用户关掉所有的浏览器之后,是不是这个session会话就会销毁呢?
答案是否定的。前面已经说到,客户端的浏览器与服务器其实是无状态连接。也就意味着,只要用户不向服务器端发送请求,服务器端是永远不知道用户此刻的状态。这样就遇到了新的问题,那就是:要是不销毁这些session,一直让它存在着,这不是更大程度的加大了服务器的负担么?是的。所以有了新的机制,那就是session失效的机制。在J2EE开发中,应用服务器通常默认的session失效时间是30分钟,但是也可以在部署描述符web.xml中通过这样的一条语句来配置这个失效时间:<session-config><session-timeout>30</session-timeout></session-config>。当用户在指定的失效时间内没有向服务端提交请求,session将会被应用服务器销毁。用户必须从重新登录来获得新的session。有时候为了方便用户在退出的时候更快速的销毁session,一般情况下会提供一个发送请求的方式去调用session.invalidate();去销毁这个session。其实用户关闭浏览器只是在用户的机器上失去了这个session的id。服务端是不知道用户的浏览器关闭了的,只能等失效时间到了就去销毁这个session了。要想在用户关闭浏览器的时候就去销毁session并不是没有办法。我们可以通过js来监听用户的关闭操作,一旦触发,就可以在这个js事件中手动发送一个销毁session的请求。
当然,以上只是讲了些session在客户端与服务端之间的用处。其实session的用处远远不止于此。在J2EE中,session是仅次于application的作用范围。我们可以利用它在我们整个会话中实现数据的共享,如果是jsp页面,可以使用其内置的隐藏对象session来设置和获取值,在多个页面之间共享。Session在自定义标签里面的使用可以使得代码的重用性达到更好。当然,如果是单个页面中的数据共享最好还是采用pageContext。这就涉及到J2EE中的几个表示范围的对象了。application可以用来在整个应用中共享数据,request可以在用户的请求与请求之间共享数据,而pageContext则可以在通页面中共享数据。他们之间也是各有千秋。session可以以单个用户的所有操作进行数据共享,这样既做到了不会干扰其他用户的操作(因为session的id在服务端是不会重复的),又可以让整个会话之间的数据传递变的更多元化、更方便。但是,session中存储的数据越多对服务端的压力也越大,这样就会影响到用户的访问速度。通常情况下,session的大小不应该超过10M,一个普通的对象大概占用1KB的大小,也就是说一个session最多不要放超过1万个对象的实例。在我们的应用中,需要传递的对象数量有很多,很可能会超过这个数量,这就需要我们在一些地方借助与request和pageContext来暂存数据,为session分忧!
同理,一旦对象或者数据存储在此session中,只要这个session的id不失去,就可以在应用代码中通过request来获取这个session,如果有不法之徒采取这种方式,那么就会显得不安全了,这就是为什么一些保密性要求比较高的网站会尽快的去销毁session的原因。
在servlet、自定义标签中都可以根据request对象来获得session,有了session就可以将处理出来的数据进行保存、获取等各种方便开发的动作了。有点值得注意的就是此处需要用HttpServletRequest对象通过getSession()的方法来获得session了。有了session的帮忙,自定义标签可以写的更具有通用性、扩展性。标签体组装数据,然后通过session来存储用户的这些数据,让开发更自由。
在用户发送请求的时候,通常会在服务端先过滤一下。常用的方式是采取Filter过滤器过滤,在filter中也可以通过request请求来获得session。例如在权限过滤中有一种方式就是当用户登录之后,将用户的一些状态保存在此用户的session中,例如一些用户可以访问的资源等。这样就可以利用session让每次用户访问的时候都可以在filter中对用户权限进行过滤。
总之,我的见解就是,session的失去不等于销毁、session的存在是服务器、session的标示是id、session的作用很大、session不应该被误解!
分享到:
相关推荐
在Web应用程序开发中,特别是在ASP.NET C#应用中,正确且有效地在类中使用Session是非常重要的,这能帮助我们实现用户个性化体验、购物车管理、登录状态维护等功能。 ### 一、理解ASP.NET中的Session Session对象...
### Java关于Session的详细解释 #### 一、Session的基本概念 在Java Web开发中,Session是一种常用的技术,用于跟踪用户的会话状态。简单来说,Session就是服务器为特定用户分配的一块内存区域,用来存储该用户在...
### 关于Servlet中的Session理解 在Web开发领域中,Servlet技术是Java Web开发的重要组成部分,而Session机制则是处理用户会话的关键技术之一。本文将基于提供的文件内容,深入探讨Servlet中Session的工作原理、...
五、JSP中的Session使用 在JSP中,可以使用内置对象`session`来直接操作Session。例如: ```jsp session.setAttribute("username", "John Doe"); // 设置Session属性 String username = (String) session....
.NET 和 IIS7.5 关于 Session 超时的设置是一个重要的议题,尤其是在构建Web应用程序时,确保用户会话的正确管理和安全至关重要。Session是ASP.NET中的一个关键概念,它用于存储用户在网站上浏览期间的状态信息。当...
### 关于Session机制详解 #### 一、术语Session 在计算机科学领域,特别是Web开发中,“session”这个词的含义较为复杂且多变。通常我们提到的“session”是指客户端与服务器之间的一次交互过程,这一过程可以持续...
4. **Session复制或共享**:在集群环境中,可以使用Session复制或共享技术,如Memcached、Redis等分布式缓存系统,确保所有服务器都能访问到用户的Session信息。 5. **代码优化**:检查并修复可能导致Session丢失的...
为了克服Session的一些缺点,可以考虑使用Cookie(但Cookie大小和数量有限制)、Viewstate(适合在同一页内保持状态)、Application(全局共享数据,不随用户变化)或者数据库存储(适合大量持久化数据)等替代方案...
本文将深入探讨Session的使用方法及其优势。 首先,理解Session的基本原理。Session数据存储在服务器端,避免了客户端直接接触敏感信息,如用户登录状态、个人信息等。在服务器端,Session是以文本文件的形式存在于...
JavaBean和Session Bean是Java企业级应用开发中的重要概念,特别是在使用Enterprise JavaBeans(EJB)技术时。本文将深入探讨这两个概念,以及如何在实际项目中使用它们。 首先,让我们了解什么是JavaBean。...
接下来,我们将深入探讨如何在.NET Core 6中使用Session进行验证。 首先,让我们了解.NET Core 6的基础架构。它是一个开源、跨平台的框架,用于构建现代云应用。由于其模块化设计,我们可以灵活地选择需要的组件,...
### jsp中session使用方法详解 #### 一、引言 在Web开发中,会话管理是一项非常重要的功能,特别是对于需要保持用户状态的应用程序来说更是如此。在Java Web开发中,`HttpSession`接口提供了在多页面请求之间保存...
关于Session的详细解释 在深入探讨Session机制之前,我们首先明确Session的概念及其在网络通信和Web开发中的作用。Session,常被译作“会话”,原意指一系列有始有终的动作或消息交换过程,例如打电话从拨号到挂断...
7. **Session管理**:在大型应用中,可能需要考虑Session的分布式存储,例如使用Redis或Memcached等缓存服务来共享Session,以解决集群环境下的Session同步问题。 8. **安全注意事项**:尽管Session提供了用户状态...
"使用session保持登陆状态"这个主题就是关于如何在用户成功登录后,通过服务器端的session技术来维持其在线状态,直到用户主动退出或者session过期。下面我们将深入探讨这个话题。 首先,我们了解什么是session。...
### Cookie、Session与Token的区别及使用详解 #### 一、Cookie **定义**: Cookie是一种用于在客户端保持状态的方案。简单来说,当你访问一个网站时,该网站可能会在你的计算机上留下一些信息(如用户名、密码等),...
本小demo以JSP为基础,旨在帮助初学者理解并掌握Session的使用方法。 首先,我们来解释一下什么是Session。Session是服务器端存储的一个数据结构,用于保存用户特定的信息,比如用户的登录状态、购物车内容等。当...
webservice服务中如果保持Session 调用Session 对于Web Service,每个方法的调用都会启动一个Session,可以用下面的方法来使多个调用在同一个Session里 CWSSyscfg cwsCfg = new CWSSyscfg(); cwsCfg....