`
djsl6071
  • 浏览: 593447 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

关于session的文章(zz)

阅读更多

关于session的文章 
刘正吉
ljj@mlc.edu.tw
未经作者同意改编,不过我相信他不会介意的

甲是某个网站的会员,他要登入网站线上购物,他在login.jsp打上他的帐号密码,认证通过後,伺服器把它丢到list.jsp浏览网站上的货物,当他选好要买的货物後要订购了,伺服器又把它丢到buy.jsp处理订货的事宜。甲这个人只在login.htm打上帐号密码,伺服器透过login.jsp确认甲是个合法注册的会员,但是list.jsp和buy.jsp使用者不需要打帐号密码,伺服器要如何确认现在进来的甲还是乙?又或者有人根本就不从login.jsp进入网站,他直接从list.jsp或buy.jsp进来,那不就避过了帐号密码的检查? 
  要解决这个问题,方法有很多,可以用html语法的<input type="hidden">的方法,或者是用cookie,但是以上两种方法的安全性还不够,应该用session来解决这个问题。刚才的问题,如果以session的流程来看,甲透过login.jsp进入网站,伺服器会给他一个独一无二的编号证明他就是甲(就好像每个人都有身份证字号,而且都不会重覆),如果是乙进来话,伺服器也给他一个独一无二的编号。这个独一无二的编号就是sessionID。这个sessionID会被送到使用者的浏览器内,当使用者到浏览其他网页时,浏览器会把这个sessionID送到伺服器,伺服器便可以比对现在来的是甲或是乙。 

1.如果你想要看你的sessionID长什么样子,语法应该这么写 
 session.getId(); 

2.甲或乙进入网站,服务器都会分配每个人一个session,每个人都不会重复,甲是会员,输入了帐号密码後顺利通过验证,这个服务器可以在他的session上做个记号,表示他通过了验证, 
  session.setAttribute("LogOk","yes"); 
这个意思是说,服务器在甲的session内放了一个LogOk的属性,它的值是"yes"。当然也还可以放别的东西,譬如说把甲输入的帐号密码放进去 
 session.setAttribute("userid","甲所输入的帐号"); 
 session.setAttribute("userpass","甲所输入的密码"); 
(请注意,这些Attribute的信息都是存在Server内,不会被送到使用者的浏览器内,会送到浏览器的只有sessionID而已。如此才能保障相关资料不被人窃取。) 
甲通过验证後,伺服器便把它导向到list.jsp做处理。(response.sendRedirect("list.jsp");)乙不是会员,当他从login.jsp进去後,没办法通过验证,於是被导向回login.jsp重新输入密码(response.sendRedirect("login.jsp");) 

3.甲被导向到list.jsp,list.jsp怎麽知道甲通过了验证,而且怎麽证明它是甲呢?可以透过下面方法把刚才在session上所做的记号取出来 
 String LogOk=(String)session.getAttribute("LogOk"); 
 String userid=(String)session.getAttribute("userid"); 
 String userpass=(String)session.getAttribute("userpass"); 
透过getAttribute取得LogOk的值,去检查一下LogOk是否等于"yes"就知道这个人有没有通过验证了,另外也取得了甲输入的帐号及密码,可以去资料库比对现在进来的是否是甲这个人。 
(要注意的是session.getAttribute("")的前面,在这个例子来讲,要加(String),因为透过setAttribute的方式存进session内的是个物件(Object),取出来时,要明确告诉java它是什麽物件,所以要用(String)session.getAttribute("LogOk")。同理,如果在存进session时是是存一个ResultSet,那取出来便要用(ResultSet)session.getAttribute("....");) 
而乙这个人呢,还不死心,login.jsp进不来,他还想骇进来,直接打list.jsp,同样的,程式从session内找出是否有LogOk,它的值是不是等於"yes",如果不是,很抱歉,又把它导回到login.jsp。 

透过session的方式,可以做到对同一个使用者在不同的网页之间资料的分享。基本上来说,tomcat对每一个网页进来的人都会建立session,其有效时间内定为30分钟,如果超过三十分钟使用者都没有再浏览任何网页,其sessionID便会失效,当然在session内所设定过属性也会消失。使用者再重新进来,便是另一个session了。 
以下的session方法,各位可以参考看看: 
session.setAttribute("属性名",属性值)----将资料存入session 
session.getAttribute("属性名");----从session取得资料 
session.setMaxInactiveInterval("秒数");---设定session的有效执行时间(单位:秒) 
session.getMaxInactiveInterval();----取得session的有效执行时间(单位:秒) 
session.isNew();----判断这个session是不是新的,是的话传回true,否则传回false 
session.invalidate();----强制session中断,常用在使用者登出时 
session.getCreateTime();----取得session建立的时间,其值为long值。 
session.getLastAccessedTime();----取得session最後的存取时间 

另外,如果有些网页,根本就不需要建立session,要如何把它关掉?应该在page的地方设定session="false" 
例:<%@ page contentType="text/html;charset=big5" session="false" %> 
如此,这个网页便不会建立任何session 
 

 

提问:关于设置Session的持续时间问题
session的设定在服务器的配置文件和页面中都可以设定,session的页面相关函数
public Object getAttribute(String name);得到变量
public java.util.Enumeration getAttributeNames( );得到变量的数组
public long getCreationTime( );这个session创建的时间
public String getId( );得到这个session的标示,其实就是你上面说的sessionid,当然也可以用getter方法得到
public long getLastAccessedTime( );最近一次session使用的时间
public int getMaxInactiveInterval( );得到session最长的停留时间
public void invalidate( );使当前的session失效
public boolean isNew( );判断是不是新建的session
public void removeAttribute(String name);删除session的属性,你的问题就可以使用这个方法
public void setAttribute(String name, Object attribute);设定属性值
public void setMaxInactiveInterval(int interval);设定session的停留时间,,我向你明白了这些函数的使用方法,你的问题就迎刃而解了
这些是网页中相关的函数,可以看看~


我用的session设定setMaxInactiveInterval(-1);API上说就是没超时常住内存,但我的session监听器中的

sessionDestroyed方法在页面关闭后却能捕获session消亡的信息.设为负数就会常驻内存,怎么还会捕获到呢.我很不解.


我的理解是:
session不会因为超时而失效,但是会话的终止一样会使会话失效。
常驻内存的前提是会话没有中断,否则他的存在就是一个垃圾,没有任何意义的保存在内存里。
对于需要始终存在与内存的信息你干吗要放在session里呢?放在application里阿?

我的疑问是这样的,session监听器中的sessionDestroyed方法是在一个session被内存清理掉时起做用吗?
那当我关闭一个页面后是否就该方法就起做用呢,还是要等到session超时才起做用!

打开页面,建立一个会话以后一直到关闭这个页面结束会话的这个时间里,如果会话停止超过一定时间就会失效。
而如果你关闭了页面会话都结束了,就根本没有超时这个说法了。

有一点你要清楚的是,jvm的垃圾回收会系统自动调用的,分配的内存空间被占用后到底什么时候都是不确定的,jvm的规范中队着一块很松散,没有具体的要求,所以各个jvm对于gc的实现都会不一样。所以sessionDestroyed方法绝对不可能在内存被清理掉而被调用,而可能是session失效时通过监听器方法被监听到而触发。

希望能够对你有帮助。

 

分享到:
评论

相关推荐

    关于SESSION的好文章

    【标题】:深入理解Web开发中的Session机制 【描述】:本文将详尽解析Web开发中的Session机制,从基本概念到实际应用,帮助读者全面掌握Session在维持客户端与服务器状态中的重要作用。 【标签】:Session,HTTP...

    servlet中关于session的理解

    ### 关于Servlet中的Session理解 在Web开发领域中,Servlet技术是Java Web开发的重要组成部分,而Session机制则是处理用户会话的关键技术之一。本文将基于提供的文件内容,深入探讨Servlet中Session的工作原理、...

    Java关于session的详细解释

    ### Java关于Session的详细解释 #### 一、Session的基本概念 在Java Web开发中,Session是一种常用的技术,用于跟踪用户的会话状态。简单来说,Session就是服务器为特定用户分配的一块内存区域,用来存储该用户在...

    .net 和IIS7.5关于Session超时的设置

    .NET 和 IIS7.5 关于 Session 超时的设置是一个重要的议题,尤其是在构建Web应用程序时,确保用户会话的正确管理和安全至关重要。Session是ASP.NET中的一个关键概念,它用于存储用户在网站上浏览期间的状态信息。当...

    关于session.doc

    ### 关于Session机制详解 #### 一、术语Session 在计算机科学领域,特别是Web开发中,“session”这个词的含义较为复杂且多变。通常我们提到的“session”是指客户端与服务器之间的一次交互过程,这一过程可以持续...

    关于session丢失问题

    在IT行业中,Session是Web应用程序中用于保持用户状态的关键机制。当用户登录网站后,服务器会为该用户创建一个唯一的Session ID,并将其存储在服务器端,通常是在内存中。然后,这个Session ID会通过Cookie或者URL...

    一篇关于介绍一篇关于session的好文章,写的很详细

    介绍一篇关于session的好文章,写的很详细session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。

    很不错的session文章介绍

    【Session详解】 Session机制在Web应用程序中扮演着重要的角色,它允许服务器端在多个HTTP请求之间保持用户的状态信息。在互联网早期,HTTP协议是无状态的,这意味着每次客户端(浏览器)向服务器发送请求,服务器...

    关于session的详细解释.pdf

    关于Session的详细解释 在深入探讨Session机制之前,我们首先明确Session的概念及其在网络通信和Web开发中的作用。Session,常被译作“会话”,原意指一系列有始有终的动作或消息交换过程,例如打电话从拨号到挂断...

    session session session szsessdifn

    【session session session szsessdifn】 在Web开发中,Session是一个至关重要的概念,尤其是在ASP.NET框架下。Session机制是服务器端存储用户特定信息的一种方式,它允许开发者在多个页面之间保持用户状态,解决了...

    一个关于Session的小demo

    本小demo以JSP为基础,旨在帮助初学者理解并掌握Session的使用方法。 首先,我们来解释一下什么是Session。Session是服务器端存储的一个数据结构,用于保存用户特定的信息,比如用户的登录状态、购物车内容等。当...

    关于session与cookie的原理简述

    【Session与Cookie原理简述】 Session和Cookie是两种在Web开发中常见的用户状态管理机制,它们主要用于在HTTP协议无状态的特性下跟踪用户状态。理解它们的原理对于编写高效的Web应用至关重要。 **Cookie原理** ...

    session驱动类 session存入数据库

    session驱动类 session存入数据库 数据库存储session 用于session存入数据库

    js操作session例子

    本篇文章将详细讲解如何在JavaScript中实现对Session的操作,以及解决由此带来的挑战。 首先,理解Session的基本概念。Session是服务器端存储的一种会话状态,它可以保存用户在浏览网站时产生的临时数据,例如登录...

    自己实现的spring-session

    如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建session,并把redis中此session的相关数据赋值给新建的session,最后保存sessionId...

    spring session redis分布式session

    Spring Session通过与Redis的集成,将Session数据序列化后存储到Redis中,每次请求时从Redis读取Session数据,确保了多服务器间的Session一致性。 **3. 集成Spring Session与Redis** 首先,你需要在项目中添加...

    关于如何清空session的例子

    在Web开发中,Session是一种非常重要的技术,用于在服务器端存储用户会话信息,以便在用户与服务器交互过程中保持状态。当用户登录后,服务器通常会创建一个Session对象,并将用户的标识(如用户名)存储在其中,...

    js 销毁session,session

    js 销毁session,session js 销毁session,session

    判断session过期的方式

    本篇文章将详细介绍三种判断Session过期的方法。 ### 1. 检查Session有效期 这是最直接的方式,服务器在创建Session时会设置一个过期时间,例如30分钟。每当用户发送请求时,服务器都会检查当前Session是否超过...

Global site tag (gtag.js) - Google Analytics