网站地图
3936.net
学霸百科 没有你查不到的
session(计算机术语)

「官网地址0365.tv」-「永久地址0365.tv」

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。

为了满足实时远程监测系统的需求,服务器需要实时监测客户端的连接状态。为此利用ICE中间件的优点设计了一种基于面向对象ICE中间件自定义Session机制的解决方案。

Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。以及如果需要的话,可能还有一定的操作空间。

需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。

session的工作原理:

(1)当一个session第一次被启用时,一个独一的标识被存储于本地的cookie中。

(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。

(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。

(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

那什么是Session的解决方案呢?用户访问一个网站时往往需要浏览许多网页。Session的使用在不同的语言中的使用方法特点不尽相同。对于一个通过PHP构筑的网站来说,用户在访问的过程中需要执行许多的PHP脚本。然而由于HTTP协议自身的特点,用户每执行一个PHP脚本都需要和Web服务器重新建立连接。

又由于无状态记忆的特点,此次连接无法得到上次连接的状态。这样,用户在一个PHP脚本中对一个变量进行了赋值操作,而在另外一个PHP脚本中却无法得到这个变量的值。例如,用户在负责登录的PHP脚本中设置了$user="wind",却无法在另一个PHP脚本中通过调用$user来获得“wind”这个值。也就是说,在一次HTTP请求中,PHP无法将已经赋值的参数传递给下一次http请求的脚本。因此,每个PHP脚本中所定义的变量都是只在本次HTTP请求内有效,本次HTTP请求结束,PHP就会释放掉这些为这些变量分配的内存。

Session解决方案,就是要提供在PHP脚本中定义全局变量的方法,使得这个全局变量在同一个Session中对于所有的PHP脚本都有效。提到了,Session不是一个简单的时间概念,一个Session中还包括了特定的用户和服务器。因此更详细地讲,在一个Session定义的全局变量的作用范围,是指这个Session所对应的用户所访问的所有PHP。

例如A用户通过Session定义了一个全局变量$user=“wind”中,而B用户通过Session定义的全局变量$user=“jane”。那么在A用户所访问的PHP脚本中,$user的值就是wind。

Session 是 用于保持状态的基于Web服务器的方法。Session允许通过将对象存储在Web服务器的内存中在整个用户会话过程中保持任何对象。

Session通常用于执行以下操作

存储需要在整个用户会话过程中保持其状态的信息,例如登录信息或用户浏览Web应用程序时需要的其它信息。

存储只需要在页面重新加载过程中或按功能分组的一组页之间保持其状态的对象。

Session的作用就是它在Web服务器上保持用户的状态信息供在任何时间从任何设备上的页面进行访问。因为浏览器不需要存储任何这种信息,所以可以使用任何浏览器,即使是像Pad或手机这样的浏览器设备。

持久性方法的限制

随着越来越多用户登录,Session所需要的服务器内存量也会不断增加。

访问Web应用程序的每个用户都生成一个单独的Session对象。每个Session对象的持续时间是用户访问的时间加上不活动的时间。

如果每个Session中保持许多对象,并且许多用户同时使用Web应用程序(创建许多Session),则用于 Session持久性的服务器内存量可能会很大,从而影响了可伸缩性。

cookies和session,JSP基本语法,JSP使用JavaBean,整合Servlet和JSP(MVC),JSP表达式语言,JSP自制标签,数据库JDBC,网络安全,Servlet和JSP过滤器,Web应用事件监听器,具体内容如下:

1、对于值类型的变量,Session中保存的是值类型的拷贝

Session["__test0"] = 1;

int i = (int)Session["__test0"]+1;

int j = (int)Session["__test0"];

结果:i=2,j=1

2、对于引用类型的变量,Session中保存的是引用

CDACommon cda = new CDACommon();

Session["__test"] = cda.GetDataSet("select top 1 * from tb_customer");

DataSet ds = (DataSet)Session["__test"];

DataSet ds2 = (DataSet)Session["__test"];

ds.Tables[0].Rows[0][0]="9999";

结果:

ds.Tables[0].Rows[0][0]=="9999"

ds2.Tables[0].Rows[0][0]=="9999";

3、Session周期

新的浏览器窗口启动后,开始一个新的Session,触发Global的Session_Start的调用,从第一个浏览器窗口打开的浏览器窗口不启动新的Session。Session过期后,执行页面的提交也会触发Session_Start,等于是新的一个Session。

4、调用Session

对于Web Service,每个方法的调用都会启动一个Session,可以用下面的方法来使多个调用在同一个Session里 :

CWSSyscfg cwsCfg = new CWSSyscfg(); cwsCfg.CookieContainer = new System Net.CookieContainer(); CWSSyscfg是一个Web Service类,Web Service的给代理类设置CookieContainer属性,只要多个代理的CookieContainer属性是相同的值,则对这些Web Service的调用在同一个Session。可以用单例模式来实现。

5、Session数据有效期

只要页面有提交活动,则Session的所有项都会保持,页面在20分钟(默认配置)内没有任何提交活动时Session会失效。Session内存储的多个数据项是整体失效的。

6、Session的保存

在Session中如果保存的是非序列化的类比如DataView,在用SQLServer保存Session的模式下,无法使用。查看一个类是否是序列化的方法是,需看是否用[Serializable]来标记了该类。

PHP session变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

PHP Session变量:

您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于HTTP地址无法保持状态,Web服务器并不知道您是谁以及您做了什么。

PHP session解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。

Session的工作机制是:为每个访客创建一个独一的id (UID),并基于这个UID来存储变量。UID存储在cookie 中,或者通过URL进行传导。

Jsp的session是使用bean的一个生存期限,一般为page,session意思是在这个用户没有离开网站之前一直有效,如果无法判断用户何时离开,一般依据系统设定,tomcat中设定为30分钟。

使用session功能,可以达到多个jsp程序从操作同一个java bean,那么这个java bean可以作为传统意义上的"全局变量池".(在java中可以使用static静态化一个变量和方法,使用singleton独一化对象。)

在项目实践中,Jsp程序中很多参数需要从数据库中读取,有的参数实际读取一次就可以,如果设计成每个用户每产生一个页面都要读取数据库,很显然,数据库的负载很大,同时也浪费时间,虽然可能有数据库连接池优化,但是尽量少使用数据库是我们编程的原则。

JSP使用一个叫HttpSession的对象实现同样的功能。HTTPSession是一个建立在cookies 和URL-rewriting上的高质量的界面。Session的信息保存在服务器端,Session的id保存在客户机的cookie中。事实上,在许多服务器上,如果浏览器支持的话它们就使用cookies,但是如果不支持或废除了的话就自动转化为URL-rewriting,session自动为每个流程提供了方便地存储信息的方法。

Httpsession具有如下API:

getId 此方法返回独一的标识,这些标识为每个session而产生。当只有一个单一的值与一个session联合时,或当日志信息与先前的sessions有关时,它被当作键名用。

GetCreationTime 返回session被创建的时间。最小单位为千分之一秒。为得到一个对打印输出很有用的值,可将此值传给Date constructor 或者GregorianCalendar的方法setTimeInMillis.

GetLastAccessedTime 返回session最后被客户发送的时间。最小单位为千分之一秒。

GetMaxInactiveInterval 返回总时间(秒),负值表示session永远不会超时。

getAttribute 取一个session相联系的信息。(在jsp1.0中为 getValue)。

Integer item = (Integer) session.getAttribute("item") //检索出session的值并转化为整型。

setAttribute 提供一个关键词和一个值。会替换掉任何以前的值。(在jsp1.0中为putValue)。

session.setAttribute("ItemValue", itemName); // ItemValue 必须不是must简单类型。

在应用中使用最多的是getAttribute和setAttribute。现以一个简单的例子来说明session的应用,test1.jsp(信息写入session),test2.jsp(从session读出信息)。

test1.jsp

<HTML>

<HEAD>

<TITLE> Document </TITLE>

</HEAD>

<BODY BGCOLOR="#FFFFFF">

<%

session.setAttribute("str",new String(“this is test”));

%>

</BODY>

</HTML>

test2.jsp

<HTML>

<HEAD>

<TITLE> New Document </TITLE>

</HEAD>

<BODY BGCOLOR="#FFFFFF">

<%

String ls_str=null;

ls_str=(String)session.getAttribute("str");

out.println(“从session里取出的值为:”+ls_str);

%>

</BODY>

</HTML>

php中的Session与Cookie

在PHP开发中对比起Cookie,session是存储在服务器端的会话,相对安全,并且不像Cookie那样有存储长度限制,简单介绍session的使用。

由于Session是以文本文件形式存储在服务器端的,所以不怕客户端修改Session内容。实际上在服务器端的Session文件,PHP自动修改session文件的权限,只保留了系统读和写权限,而且不能通过ftp修改,所以安全得多。

对于Cookie来说,假设要验证用户是否登陆,就必须在Cookie中保存用户名和密码(可能是md5加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为并不能只做一次验证。为什么呢? 因为客户端Cookie中的信息是有可能被修改的。假如你存储$admin变量来表示用户是否登陆,$admin为true的时候表示登陆,为false的时候表示未登录,在第一次通过验证后将$admin等于true存储在Cookie,下次就不用验证了是错的,假如有人伪造一个值为true的$admin变量, 非常的不安全。

而Session就不同了,Session是存储在服务器端的,远程用户没办法修改session文件的内容,因此可以单纯存储一个$admin变量来判断是否登陆,首次验证通过后设置$admin值为true,以后判断该值是否为true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证Cookie而传递密码的不安全性了(session验证只需要传递一次,假如你没有使用SSL安全协议的话)。即使密码进行了md5加密,也是很容易被截获的。

当然使用session还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。

session在php.ini一般不需要设置,因为并不是每个人都有修改PHP.ini的权限,默认session 的存放路径是服务器的系统临时文件夹,可以自定义存放在自己的文件夹里。

Php如何创建Session

开始介绍如何创建session。非常简单,真的。

启动session会话,并创建一个$admin变量:

// 启动session

session_start();

// 声明一个名为admin的变量,并赋空值。

$_session["admin"] = null;

>

如果你使用了Session,或者该PHP文件要调用Session变量,那么就必须在调用Session之前启动它,使用 session_start()函数。其它都不需要你设置了,PHP自动完成session文件的创建。

执行完这个程序后,可以到系统临时文件夹找到这个 session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,后面是32位编码后的随机字符串。用编辑器打开它,看一下它的内容:

admin|N;

Session是什么呢? 简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运行这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串。

这个的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionID所对应的用户。试想,如果没有SessionID,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然,SessionID还有很多其他的作用。

除了SessionID,在每个Session中还包含很多其他信息。但是对于编写ASP或ASP .NET的程序员来说,最有用的还是可以通过访问ASP/ASP .NET的内置Session对象,为每个用户存储各自的信息。例如我们想了解一下访问我们网站的用户浏览了几个页面,我们可能在用户可能访问到每个的页面中加入:

<% If Session("PageViewed") = ""Then Session("PageViewed") = 1 Else Session("PageViewed") = Session("PageViewed") + 1 End If %>

通过以下这句话可以让用户得知自己浏览了几个页面:

<% Response.Write("You have viewed " & Session("PageViewed") & " pages") %>

可能有些读者会问:这个看似像是数组的Session(“..”)是哪里来的? 需要我定义吗? 实际上,这个Session对象是具有ASP解释能力的的WWW服务器的内建对象。也就是说ASP的系统中已经给你定义好了这个对象,你只需要使用就行了。其中Session(“..")中的..就好像变量名称,Session(“..")=$$中的$$就是变量的值了。你只需要写上句话,在这个用户的每个页面中都可以访问..变量中的值了。

其实ASP会话一共内建了7个对象,有Session、Application、Cookie、Response、Request、Server等。在其他的服务器端脚本语言如JSP、PHP等中也有其类似的对象,只是叫法或者使用方法上不太一样。

一般内容结构

变量名|类型:长度:值;

并用分号隔开每个变量。有些是可以省略的,比如长度和类型。

来看一下验证程序,假设数据库存储的是用户名和md5加密后的密码:

//表单提交后...

$posts = $_POST;

// 清除一些空白符号

foreach ($posts as $key => $value)

{

$posts[$key] = trim($value);

}

$password = md5($posts["password"]);

$username = $posts["username"];

$query = "SELECT `username` FROM `user` WHERE `password` = '$password'";

// 取得查询结果

$userInfo = $DB->getRow($query);

if (!empty($userInfo))

{

if ($userInfo["username"] == $username)

{

// 当验证通过后,启动session

session_start();

// 注册登陆成功的admin变量,并赋值true

$_SESSION["admin"] = true;

}

else

{

die("用户名密码错误");

}

}

else

{

die("用户名密码错误");

}

在需要用户验证的页面启动session,判断是否登陆:

// 防止全局变量造成安全隐患

$admin = false;

// 启动会话,这步必不可少

session_start();

// 判断是否登陆

if (isset($_SESSION["admin"]) && $_SESSION["admin"] == true)

{

echo "您已经成功登陆";

}

else

{

// 验证失败,将 $_session["admin"] 置为 false

$_SESSION["admin"] = false;

die("您无权访问");

}

>

是不是很简单呢?将 $_session 看成是存储在服务器端的数组即可,注册的每一个变量都是数组的键,跟使用数组没有什么分别。

如果要登出系统怎么办?销毁 session 即可。

<?php

session_start();

// 这种方法是将原来注册的某个变量销毁

unset($_SESSION["admin"]);

// 这种方法是销毁整个 session 文件

session_destroy();

>

释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的session id

<?php

session_start();

session_unset();

session_destroy();

session_write_close();

setcookie(session_name(),'',0,'/');

session_regenerate_id(true);

?>

session_destroy()

删除当前用户对应的session文件以及释放session id,内存中的$_SESSION变量内容依然保留

因此,释放用户的session所有资源,需要顺序执行如下代码:

<?php

$_SESSION['user'] = ‘user1′;

session_unset();

session_destroy();

?>

Session能否像Cookie那样设置生存周期呢?有了Session是否就完全抛弃Cookie呢?想说的是,结合Cookie来使用session才是最方便的。

Session是如何来判断客户端用户的呢?它是通过Session ID来判断的,什么是Session ID,就是那个Session文件的文件名,Session ID是随机生成的,因此能保证独特性和随机性,确保Session的安全。一般如果没有设置Session的生存周期,则Session ID存储在内存中,关闭浏览器后该ID自动注销,重新请求该页面后,重新注册一个session ID。

如果客户端没有禁用Cookie,则Cookie在启动Session会话的时候扮演的是存储Session ID和session生存期的角色。

来手动设置session的生存期:

session_start();

// 保存一天

$lifeTime = 24 * 3600;

setcookie(session_name(),session_id(),time() + $lifeTime,"/");

>

其实Session还提供了一个函数session_set_cookie_params(); 来设置Session的生存期的,该函数必须在 session_start()函数调用之前调用:

// 保存一天

<?php

$lifeTime = 24 * 3600;

session_set_cookie_params($lifeTime);

session_start();

$_session["admin"] = true;

>

如果客户端使用IE6.0 , session_set_cookie_params(); 函数设置Cookie会有些问题,所以还是手动调用setcookie函数来创建cookie。

假设客户端禁用Cookie怎么办?没办法,所有生存周期都是浏览器进程了,只要关闭浏览器,再次请求页面又得重新注册Session。那么怎么传递Session ID呢? 通过URL或者通过隐藏表单来传递,PHP会自动将session ID发送到URL 上,URL形如:?PHPSESSID=bba5b2a240a77e5b44cfa01d49cf9669,其中URL中的参数PHPSESSID就是Session ID了,可以使用$_GET来获取该值,从而实现session ID页面间传递。

// 保存一天

<?php

$lifeTime = 24 * 3600;

// 取得当前session 名,默认为PHPSESSID

$sessionName = session_name();

// 取得session ID

$sessionID = $_GET[$sessionName];

// 使用session_id()设置获得的session ID

session_id($sessionID);

session_set_cookie_params($lifeTime);

session_start();

$_session["admin"] = true;

>

对于虚拟主机来说,如果所有用户的Session都保存在系统临时文件夹里,将给维护造成困难,而且降低了安全性,可以手动设置Session文件的保存路径,session_save_path()就提供了这样一个功能。可以将session存放目录指向一个不能通过Web方式访问的文件夹,当然,该文件夹必须具备可读写属性。

<?php

// 设置一个存放目录

$savePath = "./session_save_dir/";

// 保存一天

$lifeTime = 24 * 3600;

session_save_path($savePath);

session_set_cookie_params($lifeTime);

session_start();

$_session["admin"] = true;

>

同 session_set_cookie_params(); 函数一样,session_save_path()函数也必须在session_start()函数调用之前调用。

还可以将数组,对象存储在session中。操作数组和操作一般变量没有什么区别,而保存对象的话,PHP会自动对对象进行序列化(也叫串行化),然后保存于session中。下面例子说明了这一点:

<?php

class person

{

var $age;

function output() {

echo $this->age;

}

function setAge($age) {

$this->age = $age;

}

}

>

setage.PHP

<?php

session_start();

require_once "person.PHP";

$person = new person();

$person->setAge(21);

$_session['person'] = $person;

echo "check here to output age";

>

output.PHP

<?php

// 设置回调函数,确保重新构建对象。

ini_set('unserialize_callback_func','mycallback');

function mycallback($classname) {

$classname . ".PHP";

}

session_start();

$person = $_session["person"];

// 输出21

$person->output();

>

当执行setage.php文件的时候,调用了setage()方法,设置了年龄为21,并将该状态序列化后保存在session 中(PHP将自动完成这一转换),当转到output.php后,要输出这个值,就必须反序列化刚才保存的对象,又因为在解序列化的时候需要实例化一个未定义类,所以定义了以后回调函数,自动包含person.PHP这个类文件,因此对象被重构,并取得当前age的值为21,然后调用output()方法输出该值。

如何防止session超时

众所周知,当用户登录网站后较长一段时间没有与服务器进行交互,将会导致服务器上的用户会话数据(即session)被销毁。此时,当用户再次操作网页时,如果服务器进行了session校验,那么浏览器将会提醒用户session超时。

那么,如何解决用户登录后较长时间未操作而导致的session失效的问题呢?

导致这个问题的关键词有两个:一个是「长时间」,一个是「未操作」。

1、如果用户未操作的「长时间」超过了服务器配置的session超时时间,并导致session失效,那么我们延长session的超时时间,让用户原来的「长时间」与超时时间相比,变得不「长」,不就可以解决了吗?

2、如果用户是长时间「未操作」导致session失效,那么想办法产生「操作」,让用户每隔一小段时间就「操作」一次,与服务器产生交互,那么session自然也不会失效。一般情况下下,我们首先想到的是,通过改变服务器的配置,延长服务器的session超时时间。例如,在Tomcat服务器的web.xml文件中有如下节点内容:

<session-config><session-timeout>30</session-timeout></session-config>

这里的30表示session的超时时间,单位为分钟,如果用户登录后在30分钟内没有与服务器交互,那么当前用户的session将失效。我们可以配置一个更大的数值(比如60),就可以延长session的超时时间,如果将该值改为0或负数的话,则表示session永不失效。

不过在实际的工作应用中,一味地上调session的超时时间设置并不怎么常见,大多数需要实现该功能的网站都将解决问题的焦点集中在第二条思路上。例如:一些在线网站均采用定时刷新页面的方法来防止session超时。

定时刷新页面,最常见的有两种实现方式:一种是通过JavaScript+HTMLDOM,另一种则是通过meta标签来实现。

1、JavaScript+HTMLDOM,示例代码如下:

2、通过meta标签来实现(在页面中添加meta标签refresh也可以指定每隔指定时间就刷新当前页面),示例代码如下:

meta标签可以实现每过600秒就刷新一次当前页面。

在两种方案中,较好的为第二种,因为如果当前页面是在IE浏览器的模式窗口中打开的,默认情况下,self.location.reload()方法将会失效,而refreshmeta标签在IE模式窗口下仍然有效。

两种方式都实现了刷新当前页面,并且使用起来非常简单,不过很遗憾的是,它们存在一种几乎致命的缺陷。试想一下,如果在论坛发帖等需要用户输入内容的页面,用户花费较长的时间输入了许多文本内容,可是突然遇到了一个定时页面刷新,结果用户输入的所有内容都没了,估计这个时候用户连掐死你的心都有了……

因此需要在当前页面本身不刷新、不影响用户的任何操作的情况下实现定时刷新。最常见的解决方法仍然有两种。一种是在当前页面添加一个隐藏的iframe,然后在该iframe里面实现定时刷新。

此外,需要在服务器上编写对应的请求响应代码,例如ping.php中可以编写如下代码:

另外一种则是使用JavaScriptImage对象来实现定时刷新,JavaScript代码如下:

和使用iframe来实现定时刷新一样,使用JavaScriptImage对象实现定时刷新,也需要在服务器端编写类似的请求响应代码。服务器的响应可以是文字等非图片内容,非图片内容只会造成图像加载失败,而图像标签本身就是隐藏的,不管是加载成功还是失败都不会显示,毕竟我们的主要目的是发送请求给服务器,让服务器保持session处于活动状态。

当然,还可以使用Ajax来实现定时刷新,不过使用Image对象会更好一些,因为有些老式浏览器的JavaScript无法实现Ajax,但是却可以使用Image对象。此外,使用Ajax需要编写更多的代码来处理XMLHttpRequest等对象的活动。

在两种方式中,各有其优缺点。

使用iframe标签实现定时刷新的优点是:不需要编写JavaScript代码,可以在浏览器禁用JavaScript的情况下实现定时刷新;其缺点是:在某些不支持iframe标签的老式浏览器中没有效果,此外,iframe标签在浏览器中新增加了一个独立的页面,即使没有显示出来,不过其内部解析的window、document等对象仍然存在,占用的浏览器内存相对较多。

使用Image对象的优点是:与iframe相比,占用的内存相对较少,支持Image的浏览器也相对较多(现代浏览器均支持);缺点是:在浏览器禁用JavaScript的情况下就毫无用武之地了。

开发人员应根据实际需求情况来确定使用何种实现方式更好。此外,服务器在响应定时刷新的请求时,在满足要求的情况下,应返回尽可能少的数据,以节省带宽。

由于HTTP协议无状态的缺陷。WEB的设计者们提出了Cookie和Session两种解决机制。通过对两者的比较分析,指出了它们的联系与区别。

PHP中的session有效期默认是1440秒(24分钟)【weiweiok 注:php5里默认的是180分】,也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。

一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数 据库,这样可以通过SQL语句来删除所有过期的session,精确地控制session的有效期。这也是基于PHP的大型网站常用的方法。但是,一般的小型网站,似乎没有必要这么劳师动众。

但是一般的Session的生命期有限,如果用户关闭了浏览器,就不能保存Session的变量了!那么怎么样可以实现Session的永久生命期呢?

大家知道,Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可以 使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……

要实现Session的永久生命期,首先需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分):

1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;

2、session. name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”;

3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!

4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!

ASP的开发人员都正在使用Session这一强大的功能,但是在使用的过程中却发现了ASP Session有以下缺陷:

进程依赖性

ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。

Session状态使用范围的局限性

当一个用户从一个网站访问到另外一个网站时,这些Session信息并不会随之迁移过去。例如:新浪网站的WWW服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些WWW服务器共享Session信息怎么办呢?

Cookie的依赖性

实际上客户端的Session信息是存储在Cookie中的,如果客户端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。

鉴于ASP Session的以上缺陷,微软的设计者们在设计开发 ASP .NET Session时进行了相应的改进,完全克服了以上缺陷,使得ASP .NET Session成为了一个更加强大的功能。

Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持久化操作核心API。

注意这里的Session的含义,它与传统意思上web层的HttpSession并没有关系,Hibernate Session之于Hibernate,相当于JDBC Connection相对与JDBC。

Session对象是有生命周期的,它以Transaction对象的事务开始和结束边界。

Session作为贯穿Hibernate的持久化管理器核心,提供了众多的持久化的方法,如save(),update,delete,find(Hibernate 3中已经取消了此方法,)等,通过这些方法可以透明的完成对象的增删改查(CRUD-- create read update delete),这里所谓的透明是指,Session在读取,创建和删除映射的实体对象的实例时,这一系列的操作将被转换为对数据库表中数据的增加,修改,查询和删除操作。

Session有以下的特点:

1、不是线程安全的,应该避免多个线程共享同一个Session实例;

2、Session实例是轻量级的,所谓轻量级:是指他的创建和删除不需要消耗太多资源;

3、Session对象内部有一个缓存,被称为Hibernate第一缓存,他存放被当前工作单元中加载的对象,每个Session实例都有自己的缓存。

org.hibernate Interface Session

public interface Session extends Serializable : 是一个Java application 和Hibernate之间主要的运行时接口,这是执行持久化服务的中心API。

主要方法:

public Transaction beginTransaction() throws HibernateException:返回和当前Session对象相互联系的Transaction对象(表示在数据库中重新开始一个事务)

public Transaction getTransaction():返回和当前session联系的Transaction对象

public Connection connection close() throws HibernateExcepton:结束当前的Session对象

public void clear() :清空Session,清除所有保存在当前Session缓存中的实体对象,终止所有正在执行的方法(eg: save(),update(),delete() .....)

public Serializable save(Object object)throws HibernateException 对当前参数指定的对象进行持久化(系统会首先赋予参数对象一个标识符OID),他相当于insert语句 后面在详细介绍

public Connection connection() throws HibernateException 得到当前Session 中包含的Connection对象

public boolean contains(Object object):判断参数给出的对象(持久化类)是否在当前Session的缓存中

public void evict(Object object) throws HibernateException :将参数给出的Object从当前Session对象类中删除,使这个对象从持久态变成游离态,这种状态的改变不会引起对数据库的同步

public Object load(Class theclass,Serializable id) throws HibernateException 返回第一个参数指定类对应的表中,第二个参数指定的行(第二个参数就是要取得对象的OID,他对应表中主键列的值)

public void update(Object object) throws HibernateException :更新一个对象到数据库中

public void delete (Object object)throws HibernateException:从数据库中删除和参数指定的对象对应的记录

public Object get(Class class,Serializable id) throws HibernateException:和load()方法一样区别在于,如果数据库表中没有对应的记录,get()方法返回null,load()方法将报异常

Transaction接口是Hibernate的数据库事务接口,用于管理事务,他对底层的事务作出了封装,用户可以使用Transaction对象定义自己的对数据库的原子操作,底层事务包括:JDBC API,JTA(Java Transaction API)。

一个Transaction对象的事务可能会包括多个对数据库进行的操作

org.hibernate Interface Transaction

public interface Transaction

常用方法

public void commit() throws HibernateException 刷新当前的Session以及结束事务的工作,这个方法将迫使数据库对当前的事务进行提交

public void rollback() throws HibernateException :强迫回滚当前事务

public boolean isActive() throws HibernateException:这个事务是否存活

----------------------------------------------------------------------------------------

Session:当中包含一个Connection对象

Connection c =session.getConnection();

Session的缓存用于临时保存持久化的对象,等到一定时候,再将缓存中的对象保存到数据库中。

应用程序事务:如果一个Session中包含有多个Transaction(数据库事务),这些Transaction的集合称为应用程序事务标准使用形式:

Configuration config=new Configuration().configure("hibernate.cfg.xml");

SessionFactory sessionfactory=config.buildSessionFactory();

Session session=sessionfactory.openSession();

Transaction tx=session.beginTransaction();

try

{

session.save();

tx.commit();

}

catch(Exception e)

{

if(tx!=null) tx.rollback();

}

finally

{

session.close ();

}