当前位置:文档之家› php5的session详解

php5的session详解

php5的session详解
php5的session详解

php5的session详解其一:什么是session?

Session的中文译名叫做“会话”,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。目前社会上对session的理解非常混乱:有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话是指从一个浏览器窗口打开到关闭这个期间;也可以看到“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程;然而有时候也可能仅仅是指一次连接;其中的差别只能靠上下文来推断了。

然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者“一个POP3session”。

鉴于这种混乱已不可改变,要为session下个定义就很难有统一的标准。而在阅读session相关资料时,我们也只有靠上下文来推断理解了。不过我们可以这样理解:例如我们打电话,从拨通的那一刻起到挂断电话期间,因为电话一直保持着接通的状态,所以把这种接通的状态叫做session。它是访客与整个网站交互过程中一直存在的公有变量,在客户端不支持COOKIE的时候,为了保证数据正确、安全,就采用SESSION变量。访问网站的来客会被分配一个唯一的标识符,即所谓的会话ID。它要么存放在客户端的cookie,要么经由URL传递。

SESSION的发明填补了HTTP协议的局限:HTTP协议被认为是无状态协议,无法得知用户的浏览状态,当它在服务端完成响应之后,服务器就失去了与该浏览器的联系。这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通

的(非会员制)大卖场之间的关系一样。

因此通过SESSION(cookie是另外一种解决办法)记录用户的有关信息,以供用户再次以此身份对web服务器提起请求时作确认。会话的发明使得一个用户在多个页面间切换时能够保存他的信息。网站编程人员都有这样的体会,每一页中的变量是不能在下一页中使用的(虽然form,url也可以实现,但这都是非常不理想的办法),而SESSION中注册的变量就可以作为全局变量使用了。

那么SESSION到底有什么用处呢?网上购物时大家都用过购物车,你可以随时把你选购的商品加入到购物车中,最后再去收银台结帐。在整个过程中购物车一直扮演着临时存贮被选商品的角色,用它追踪用户在网站上的活动情况,这就是SESSION的作用,它可以用于用户身份认证,程序状态记录,页面之间参数传递等。

SESSION的实现中采用COOKIE技术,SESSION会在客户端保存一个包含session_id(SESSION编号)的COOKIE;在服务器端保存其他session变量,比如session_name等等。当用户请求服务器时也把session_id一起发送到服务器,通过session_id提取所保存在服务器端的变量,就能识别用户是谁了。同时也不难理解为什么SESSION有时会失效了。

当客户端禁用COOKIE时(点击IE中的“工具”—“internet="">Internet 选项”,在弹出的对话框里点击“安全”—“自定义级别”项,将“允许每个对话COOKIE”设为禁用),session_id将无法传递,此时SESSION失效。不过php5在linux/unix平台可以自动检查cookie状态,如果客户端设置了禁用,则系统自动把session_id附加到url上传递。windows主机则无此功能。

2、Session常见函数及用法?

●Session_start():开始一个会话或者返回已经存在的会话。

说明:这个函数没有参数,且返回值均为true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前浏览器不能有任何输出,否则会发生以下错误:

Warning:Cannot send session cache limiter-headers already sent(output

started at/usr/local/apache/htdocs/cga/member/1.php:2)…………

你可以在php="">php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。但启用该选项也有一些限制,如果确实启用了session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。

请求结束后所有注册的变量都会被序列化。已注册但未定义的变量被标记为未定义。在之后的访问中这些变量也未被会话模块定义,除非用户以后定义它们。警告:有些类型的数据不能被序列化因此也就不能保存在会话中。包括resource变量或者有循环引用的对象(即某对象将一个指向自己的引用传递给另一个对象)。

●注册SESSION变量:

PHP5使用$_SESSION[‘xxx’]=xxx注册SESSION全局变量。和GET,POST,COOKIE 的使用方法相似。

注意:session_register(),session_unregister,session_is_registered 在php5下不再使用,除非在php.ini里把register_globle设为on,不过出于安全考虑,强烈建议关闭register_globle。HTTP_SESSION_VARS也不提倡使用了,官方建议用$_SESSION代替之。例如:

Page1.php

Session_start();//使用SESSION前必须调用该函数。

$_SESSION[‘name’]=”我是黑旋风李逵!”;//注册一个SESSION变量

$_SESSION[‘passwd’]=”mynameislikui”;

$_SESSION[‘time’]=time();

echo'
通过COOKIE传递SESSION'; _fcksavedurl=""page2.php">通过COOKIE传递SESSION';"//如果客户端支持cookie,可通过该链接传递session到下一页。

echo'
通过URL传递SESSION';//客户端不支持cookie时,使用该办法传递session.

?>

Page2.php

session_start();

echo$_SESSION['name'];//

echo$_SESSION['passwd'];//

echo date('Y m d H:i:s',$_SESSION['time']);

echo'
返回山一页';

?>

php5的session详解之二:有两种方法传递一个会话ID:

cookie

URL参数

会话模块支持这两种方法。cookie更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话ID嵌入到URL中间去。

PHP可以透明地转换连接。除非是使用PHP 4.2或更新版本,需要手工在编译PHP时激活。在Unix下,用--enable-trans-sid配置选项。如果此配置选项和运行时选项https://www.doczj.com/doc/705751358.html,e_trans_sid都被激活(修改php.ini),相对URI将被自动修改为包含会话ID。

●session_id

session_id()用于设定或取得当前session_id。php5中既可以使用session_id(),也可以通过附加在url上的SID取得当前会话的session_id和session_name。

如果session_id()有具体指定值的话,将取代当前的session_id值。使用该函数前必须启动会话:session_start();

当我们使用session cookies时,如果指定了一个session_id()值,每次启动session_start()都会往客户端发送一个cookie值。不论当前session_id 是否与指定值相等。

session_id()如果没有指定值,则返回当前session_id();当前会话没有启动的话,则返回空字符串。

●检查session是否存在?

在以往的php版本中通常使用session_is_register()检查session是否存在,如果您使用$_SESSION[‘XXX’]=XXX来注册会话变量,则session_is_register()函数不再起作用。你可以使用

isset($_SESSION[‘xxx’])来替代。

●更改session_id

session_regenerate_id()更改成功则返回true,失败则返回false。

使用该函数可以为当前session更改session_id,但不改变当前session的其他信息。例如:

session_start();

$old_sessionid=session_id();

session_regenerate_id();

$new_sessionid=session_id();

echo"原始SessionID:$old_sessionid
";

echo"新的SessionID:$new_sessionid
";

echo"

";

print_r($_SESSION);

echo"

";

?>

●session_name()返回当前session的name或改变当前session的name。如果要改变当前session的name,必须在session_start()之前调用该函数。注意:session_name不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的session id.

session改名示例:

$previous_name=session_name("WebsiteID");

echo"新的session名为:$previous_name
";

?>

●如何删除session?

1、unset($_SESSION['xxx'])删除单个session,unset($_SESSION['xxx'])用来unregister一个已注册的session变量。其作用和session_unregister()相同。session_unregister()在PHP5中不再使用,可将之打入冷宫。

unset($_SESSION)此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。

2、$_SESSION=array()删除多个session

3、session_destroy()结束当前的会话,并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量(globalvariables),也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。

返回值:布尔值。

功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true

session_unset()如果使用了$_SESSION,则该函数不再起作用。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了。

下面是PHP官方关于删除session的案例:

//初始化session.

session_start();

/***删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/

$_SESSION=array();

/***删除sessin id.由于session默认是基于cookie的,所以使用setcookie

删除包含session id的cookie.***/

if(isset($_COOKIE[session_name()])){

setcookie(session_name(),'',time()-42000,'/'); }

//最后彻底销毁session.

session_destroy();

?>

由此我们可以得出删除Session的步骤:

①session_start()

②$_SESSION=array()/unset($_SESSION['xxx'])

③session_destroy()

php5的session详解之三:SESSION安全:

会话模块不能保证存放在会话中的信息只能被创建该会话的用户看到。根据其存放的数据,还需要采取更多措施来主动保护会话的完整性。

评估会话中携带的数据并实施附加保护措施通常要付出代价,降低用户的方便程度。例如,如果要保护用户免于受简单的社交策略侵害(注:指在URL中显示的会话ID会被别人在电脑屏幕上看到,或被别的网站通过HTTP Referer 得到等),则应该启用https://www.doczj.com/doc/705751358.html,e_only_cookies。此情形下,客户端必须无条件启用cookie,否则会话就不工作。

有几种途径会将现有的会话ID泄露给第三方。泄露出的会话ID使第三方能够访问所有与指定ID相关联的资源。第一,URL携带会话ID。如果连接到外部站点,包含有会话ID的URL可能会被存在外部站点的Referer日志中。第二,较主动的攻击者可能会侦听网段的数据包。如果未加密,会话ID会以明文方式在网络中流过。对此的解决方式是在服务器上实施SSL并强制用户使用。

默认情况下,所有与特定会话相关的数据都被存储在由INI选项session.save_path指定的目录下的一个文件中。对每个会话会建立一个文件(不论是否有数据与该会话相关)。这是由于每打开一个会话即建立一个文件,不论是否有数据写入到该文件中。注意由于和文件系统协同工作的限制,此行为有个副作用,有可能造成用户定制的会话处理器(例如用数据库)丢失了未存储数据的会话。

上面介绍函数下文将会用到,但还有一些有关session的函数也介绍一下:

session_encode

函数功能:sesssion信息编码

函数原型:string session_encode(void);

返回值:字符串

功能说明:返回的字符串中包含全局变量中各变量的名称与值,形式如:

a|s:12:"it is a test\";c|s:4:"lala";a是变量名s:12代表变量a的值"it is a test的长度是12变量间用分号”;”分隔。

session_decode

函数功能:sesssion信息解码

函数原型:boolean session_decode(string data)

返回值:布尔值

功能说明:这个函数可将session信息解码,成功则返回逻辑值true

Php5不再使用session_id,而是把它变成一个常量SID,并保存在cookie中。如果客户端禁用了cookie,php会自动通过url自动传动传递SID,其条件是设置php.ini中的https://www.doczj.com/doc/705751358.html,e_trans_sid=1。此时即使客户端即使禁用了cookie 也没关系了。

用strip_tags()来输出SID以避免XSS相关的攻击。

Session跨页传递问题:

session跨页传递需要考虑三种情况:

①客户端禁用了cookie。

②浏览器出现问题,暂时无法存取cookie

③php.ini中的https://www.doczj.com/doc/705751358.html,e_trans_sid=0或者编译时没有打开--enable-trans-sid选项

为什么会这样呢?下面解释一下原因:

Session文件分为两部分:session变量保存在服务器端(默认以文件方式存储session);而session id则以cookie形式保存在客户端。(注意:session默认是基于cookie的)。

当用户的浏览器向服务器提出请求时,同时发送包含session id的cookie(默认情况下)。服务器根据客户端提供的session id来得到用户的文件,即保存在服务器端的session变量值。事实上,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……。也就是说,session id

是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session id,定义session变量以一定形式存储在刚才产生的session文件中。通过session id,可以取出定义的变量。跨页后,为了使用session,你必须又执行session_start();将又会产生一个session文件,与之对应产生相应的session id(注:又会产生是有条件的,如果用户没有禁止Cookie的话,session id是可以隐藏的传过去的,也就是说不会产生新的session id,但如果禁止了Cookie的话,就需要手动传递session id来解决此问题了,见例2)),用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的session文件,直接读取与这个id对应的session文件。

PHP中的session在默认情况下是使用客户端的Cookie来保存session id 的,所以当客户端的cookie出现问题的时候就会影响session了。必须注意的是:session不一定必须依赖cookie,这也是session相比cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,其一:“php.ini中的https://www.doczj.com/doc/705751358.html,e_trans_sid=1或者编译时打开打开了--enable-trans-sid选项”;其二:运行PHP的服务器必须是unix/linux 系统,windows不具备此项功能。

php5的session详解之四:session跨页传递问题的三条途径

明白了以上的道理,我们就可以得出解决session跨页传递问题的三条途径:1、设置php.ini中的https://www.doczj.com/doc/705751358.html,e_trans_sid=1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id。

2、手动通过URL传值、隐藏表单传递session id。

3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。

下面举例说明:

第一种情况:

page1.php

session_start();

$_SESSION['var1']="中华人民共和国";

$url="下一页";

echo$url;

?>

page2.php

session_start();

echo"传递的session变量var1的值为:".$_SESSION['var1'];

?>

运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果“中华人民共和国”。

现在你手动关闭客户端的cookie,再运行,可能得不到结果了吧。如果得不到结果,再“设置php.ini中的https://www.doczj.com/doc/705751358.html,e_trans_sid=1或者编译时打开打开了--enable-trans-sid选项”,又得到结果“中华人民共和国”第二种途径:s1.php

session_start();

$_SESSION['var1']="中华人民共和国";

$sn=session_id();

$url="下一页";//PHP5定义了一个常量SID来表示session_id(),$url还可以写成$url='下一页';

echo$url;

?>

s2.php

session_id($_GET['s']);

session_start();

echo"传递的session变量var1的值为:".$_SESSION['var1'];

?>

第三种途径:

login.html

HTML PUBLIC"-//W3C//DTD HTML4.01Transitional//EN">

Login

请登录:

用户名:

口令:

mylogin1.php

$name=$_POST['name'];

$pass=$_POST['pass'];

if(!$name||!$pass){

echo"用户名或密码为空,请重新登录"; die();

}

if(!($name=="laogong"&&$pass=="123")){

echo"用户名或密码不正确,请重新登录"; die();

}

//注册用户

ob_start();

session_start();

$_SESSION['user']=$name;

$psid=session_id();

$fp=fopen("e:\\tmp\\phpsid.txt","w+");

fwrite($fp,$psid);

fclose($fp);

//身份验证成功,进行相关操作

echo"已登录
";

echo"下一页";

?>

mylogin2.php

$fp=fopen("e:\\tmp\\phpsid.txt","r");

$sid=fread($fp,1024);

fclose($fp);

session_id($sid);

session_start();

if(isset($_SESSION['user'])&&$_SESSION['user']="laogong"){ echo"已登录!";

}

else{

//成功登录进行相关操作

echo"未登录,无权访问";

echo"请登录后浏览";

die();

}

?>

演示——编程思路

在社区、论坛中,我们常能看到当前在线的会员,使访问者有宾至如归之感。但这种程序是怎么做出来的呢?

流程如下:

建表user,保存注册用户信息。

字段类型备注

userid Int(10)用户序列号auto_increment关键字

username Varchar(50)用户匿称

userpwd Varchar(50)密码

email Varchar(50)电子信箱

oicq Varchar(50)OICQ号

signature mediumtext签名

imgurl Varchar(50)头像

joindate Varchar(50)加入时间

建类文件user.php定义函数

exist($username)确认新注册用户是不是已经存在

nsert($username,$userpwd,$email,$oicq,$imgurl,$signature)插入注册用户

update($userid,$username,$userpwd,$email,$oicq,$imgurl,$signature)更新用户数据

get_from_condition($con)返回满足查询条件的记录集

建表session。当用户登录时即向此表插入新记录,离开或超时后删除记录,保证表中保存的是当前在线的用户。

字段类型备注

sessionid Int(10)序列号auto_increment关键字

userid Int(10)用户序列号取自user表

ipaddress Varchar(50)Ip地址

lastactivity Int(10)最后活动时间,用它来判断用户是否还在线

建类文件session.php定义函数

insert($userid,$ipaddress,$lastactivity)把登录成功的用户插入到表中

update($userid,$ipaddress,$lastactivity)更新在线用户最后活动时间

del($con)删除满足条件的用户,用它来清除离线用户

get_from_condition($con)返回满足查询条件的记录集

公用文件global.php

include"class/config.inc.php";//把配置文件包含进来

$db=new db;

$db->db_connect();//连接数据库

$user=new user;//初始化

$session=new session;

//启动会话

session_start();

//删除session表中已经过期的用户(即非在线网友)因为此文件总是被调用从而保证显示的都是当前在线的用户

$curtime=time();

$con="lastactivity<$curtime";

$session->del($con);

//正在线的网友需不断更新session表中的lastactivity时间,并重新设置用户的COOKIES

if($HTTP_SESSION_VARS["online"]=="on"){//此处也可用

$_SESSION[“online”]

$userid=$HTTP_SESSION_VARS["userid"];//取当前在线用户的userid

$ipaddress=substr($REMOTE_ADDR,0,50);

$lastactivity=time()+3600;//更新最后活动时间,如时一个小时之内未调动页面就认为用户已离线,从而会被删除。

$session->update($userid,$ipaddress,$lastactivity);

}else{

//如果未登录那直接转入登录页面

$firstpage="logon.php";

header("Location:$firstpage");

exit;

}

登录文件logon.php

if($hiddenField=="0"){//测检表单有未被提交

$con="username='$username'and userpwd='$userpwd'";

$result=$user->get_from_condition($con);

if($user->counter==1){

if(!session_is_registered("online")){//检测是否被登记过

session_register("online");//登记一个新的变量为会话变量

}

if(!session_is_registered("ccauser")){

session_register("ccauser");

if(!session_is_registered("userid")){

session_register("userid");

}

$ccauser=$username;//给会话变量赋值

$online="on";//这个变量在global.php用到以更新最后活动时间lastactivity

$userid=$user->userid;

$ipaddress=substr($REMOTE_ADDR,0,50);

$lastactivity=time()+3600;

$con="userid=$userid";

$session->get_from_condition($con);

//判断会话是否存在,有可能你在不同的机器上登两次。

if($session->counter==1){

$session->update($userid,$ipaddress,$lastactivity);//如存在,更新

}else{

$session->insert($userid,$ipaddress,$lastactivity);//如不存在,插入

}

//在客户机设置COOKIES

SetCookie("ccauser",$username,time()+3600);

Header("Location:test.php");//然后导向测试页

}

}

?>

if($HTTP_SESSION_VARS["online"]==""){//判断是否已登录

?>

//下面是登录的表单

名称:

密码:

}else{

echo"网友:".$HTTP_COOKIE_VARS["ccauser"]."你已经登录了";//如果已登录则显示提示

$str="

退出社区";

echo$str;

}

?>

测试文件test.php

include"global.php";//把global.php文件包含进来

$strWelcome="欢迎

color=red>".$_SESSION['ccauser']."
";

echo$strWelcome;//显示欢迎信息

$str=”当前在线用户:
===================
”;

$con="1=1";

//提出session表中所有记录即是当前在线用户,未把游客算在内$result=$session->get_from_condition($con);

while($row=mysql_fetch_array($result)){

$con1="userid=$row[userid]";

$user->get_from_condition($con1);

$str.=$user->username."";

}

echo$str;

?>


退出社区

退出文件exit.php

include"global.php";//把global.php文件包含进来

if($_SESSION["online"]=="on"){

$con="userid=$userid";

$session->del($con);//在session表中删除用户信息。

session_destroy();//结束当前的会话,并清空会话中的所有资源echo"已经退出社区......";

}

?>

深入理解ServletJSP之Cookie和Session原理

由于H T T P协议的无状态特征,W e b应用中经常使用C o o k i e和S e s s i o n来保存用户在与系统交互过程中的状态数据。下面通过分析H T T P协议对C o o k i e和S e s s i o n的工作原理加以了解。 一、C o o k i e C o o k i e的含义是“服务器送给浏览器的甜点”,即服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的C o o k i e通过请求信息带到服务器端。 下面的S e r v l e t展示了C o o k i e的功能。 ......... p u b l i c v o i d d o G e t(H t t p S e r v l e t R e q u e s t r e q u e s t,H t t p S e r v l e t R e s p o n s e r e s p o n s e) t h r o w s S e r v l e t E x c e p t i o n,I O E x c e p t i o n{ r e s p o n s e.s e t C o n t e n t T y p e("t e x t/h t m l"); P r i n t W r i t e r o u t=r e s p o n s e.g e t W r i t e r(); S t r i n g o p t i o n=r e q u e s t.g e t P a r a m e t e r("o p t i o n"); i f("s h o w".e q u a l s(o p t i o n)){ //获得请求信息中的C o o k i e数据 C o o k i e[]c o o k i e s=r e q u e s t.g e t C o o k i e s(); i f(c o o k i e s!=n u l l){ //找出名称(键)为“c o o l”的C o o k i e f o r(i n t i=0;i"+c o o k i e s[i].g e t N a m e()+":" +c o o k i e s[i].g e t V a l u e()+""); } } } }e l s e i f("a d d".e q u a l s(o p t i o n)){ //创建C o o k i e对象 C o o k i e c o o k i e=n e w C o o k i e("c o o l","y e a h!"); //设置生命周期以秒为单位 c o o k i e.s e t M a x A g e(20); //添加C o o k i e r e s p o n s e.a d d C o o k i e(c o o k i e); }

Java基础-关于session的详细解释

Java基础-关于session的详细解释 session, Java, 基础, 解释 一、术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的 含义是相同的。 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差 别只能靠上下文来推断②。 然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了

电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP s ession”或者“一个POP3 session”③。 而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java 里提供的javax.servlet.http.HttpSession简称为session⑥。 鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。 在本文中,使用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表达含义⑤,使用 具体的“HttpSession”来表达含义⑥

几种session存储方式比较

几种session存储方式比较 1. 客户端cookie加密 这是我以前采用的方式,简单,高效。比较好的方法是自己采用cookie机制来实现一个session,在应用中使用此session实现。 问题:session中数据不能太多,最好只有个用户id。 参考实现:https://www.doczj.com/doc/705751358.html, 2. application server的session复制 可能大部分应用服务器都提供了session复制的功能来实现集群,tomcat,jboss,was都提供了这样的功能。 问题: 性能随着服务器增加急剧下降,而且容易引起广播风暴; session数据需要序列化,影响性能。 如何序列化,可以参考对象的序列化和反序列化. 参考资料 Tomcat 5集群中的SESSION复制一 Tomcat 5集群中的SESSION复制二 应用服务器-JBoss 4.0.2集群指南 3. 使用数据库保存session 使用数据库来保存session,就算服务器宕机了也没事,session照样在。 问题: 程序需要定制; 每次请求都进行数据库读写开销不小(使用内存数据库可以提高性能,宕机就会丢失数据。可供选择的内存数据库有BerkeleyDB,MySQL的内存表); 数据库是一个单点,当然可以做数据库的ha来解决这个问题。 4. 使用共享存储来保存session 和数据库类似,就算服务器宕机了也没事,session照样在。使用nfs或windows文件共享都可以,或者专用的共享存储设备。 问题: 程序需要定制; 频繁的进行数据的序列化和反序列化,性能是否有影响; 共享存储是一个单点,这个可以通过raid来解决。 5. 使用memcached来保存session 这种方式跟数据库类似,不过因为是内存存取的,性能自然要比数据库好多了。 问题: 程序需要定制,增加了工作量; 存入memcached中的数据都需要序列化,效率较低; memcached服务器一死,所有session全丢。memchached能不能做HA 我也不知道,网站上没提。 参考资料 应用memcached保存session会话信息 正确认识memcached的缓存失效 扩展Tomcat 6.x,使用memcached存放session信息 6. 使用terracotta来保存session

c#下使用cookie和session

c#如何记住用户的信息 记录加密之后的信息,确保用户的信息安全 使用cookie和session记录用户的信息 1、保存时间 session的默认保存时间是24分钟 cookie在没有设置的情况下关闭之后立即结束生命周期 设置cookie的时间,cookie-name.Expires=Date.Now.AddDays();/DateTime.MaxValue;(永久) C#读取设置Cookie 设置: HttpCookie cookie = new HttpCookie("cookieName"); cookie.Value = "name1" HttpContext.Current.Response.Cookies.Add(cookie); 读取: HttpContext.Current.Request.Cookies["cookieName"].Value 判断cookie是否存在: if(HttpContext.Current.Request.Cookies["cookieName"]==null){ //do something } 设置cookie有效期 cookie.Expires = DateTime.Now.AddDays(1); https://www.doczj.com/doc/705751358.html,中Cookies的用法(转) 一,cookies 写入 方法1: Response.Cookies["username"].Value="gjy"; Response.Cookies["username"].Expires=DateTime.Now.AddDays(1); 方法2: System.Web.HttpCookie newcookie=new HttpCookie("username"); newcookie.Value="gjy"; newcookie.Expires=DateTime.Now.AddDays(1); Response.AppendCookie(newcookie); 创建带有子键的cookies: System.Web.HttpCookie newcookie=new HttpCookie("user"); newcookie.Values["username"]="gjy"; newcookie.Values["password"]="111";

Cookie和Session的作用和工作原理

一、Cookie详解 (1)简介 因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这点,就需要使用到Cookie了。服务器可以设置或读取Cook ies中包含信息,借此维护用户跟服务器会话中的状态。 Cookie(复数形态:Cookies),是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。 Cookie是由服务端生成的,发送给客户端(通常是浏览器)的。Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie: 内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。 硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。 (2)工作原理 1、创建Cookie 当用户第一次浏览某个使用Cookie的网站时,该网站的服务器就进行如下工作: ①该用户生成一个唯一的识别码(Cookie id),创建一个Cookie对象; ②默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。如果网站希望浏览器将该Cookie存储在磁盘上,则需要设置最大时效(maxAge),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该Cookie); ③将Cookie放入到HTTP响应报头,将Cookie插入到一个Set-Cookie HTTP请求报头中。 ④发送该HTTP响应报文。 2、设置存储Cookie 浏览器收到该响应报文之后,根据报文头里的Set-Cookied特殊的指示,生成相应的Cookie,保存在客户端。该Cook ie里面记录着用户当前的信息。 3、发送Cookie 当用户再次访问该网站时,浏览器首先检查所有存储的Cookies,如果某个存在该网站的Cookie(即该Cookie所声明的作用范围大于等于将要请求的资源),则把该cookie附在请求资源的HTTP请求头上发送给服务器。 4、读取Cookie 服务器接收到用户的HTTP请求报文之后,从报文头获取到该用户的Cookie,从里面找到所需要的东西。 (3)作用 Cookie的根本作用就是在客户端存储用户访问网站的一些信息。典型的应用有: 1、记住密码,下次自动登录。 2、购物车功能。 3、记录用户浏览数据,进行商品(广告)推荐。 (4)缺陷 ①Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。 ②由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS) ③Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。 二、Session详解 (1)简介 Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息。 Session由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中。

深入理解Session,cookie

深入理解Servlet/JSP之“Cookie和Session原理” (2008-06-29 13:41:09) 转载 标签:it it培训 java jsp servlet session cookie session持久化 由于HTTP协议的无状态特征,Web应用中经常使用Cookie和Session来保存用户在与系统交互过程中的状态数据。下面通过分析HTTP协议对Cookie和Session的工作原理加以了解。 一、Cookie Cookie的含义是“服务器送给浏览器的甜点”,即服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的Cookie通过请求信息带到服务器端。 下面的Servlet展示了Cookie的功能。 ... ... ... public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String option = request.getParameter("option"); if ("show".equals(option)) { //获得请求信息中的Cookie数据 Cookie[] cookies = request.getCookies(); if (cookies != null) { //找出名称(键)为“cool”的Cookie for (int i = 0; i < cookies.length; i++) { if ("cool".equals(cookies[i].getName())) { out.println("

" + cookies[i].getName() + ":" + cookies[i].getValue() + "

"); } } } } else if ("add".equals(option)) { //创建Cookie对象 Cookie cookie = new Cookie("cool", "yeah!");

页面跳转及Cookie和Session

第十五天课堂笔记 1.页面跳转的两种方式 a)请求转发 i.实现代码: ii.特点: 1.不管转发几次, 只发送一次请求 2.请求携带的数据在转发后还可以继续获取 3.地址栏在多次转发时不会改变 4.转发后的代码还可以继续执行, 但是, 只能转发一 次 5.可以转发给项目内的资源(servlet, 界面…), 但是不 能转发到项目外的资源 b)重定向 i.实现代码 ii.特点 1.重定向一次会发送两次请求 2.因为是两次请求, 所以第一次携带的数据在第二次 请求时就已经无效了, 需要再次携带数据 3.地址栏会发生改变

4.重定向后代码还可以继续执行, 但是, 只能重定向 一次 5.重定向既可以访问内部资源, 也可以访问外部资源 2.ServletContext对象 a)一个应用程序只有一个ServletContext对象, 被所有 Servlet所共享, 因此, 该对象也被称之为Application对象 b)获取ServletContext对象的三种方式: c)ServletContext对象常用的功能 i.获取全局配置信息 1.全局配置信息的定义 2.获取全局配置信息 ii.获取相关路径信息 iii.获取WebRoot下的资源文件

iv.请求转发 3.Cookie a)Cookie是一个类, 它用于存储一些少量的信息, 首先在Servlet 中创建, 然后发送到客户端浏览器进行保存, 在之后的访问服 务器的过程中, 浏览器会自动携带Cookie信息 b)Cookie信息默认存储于浏览器内存中, 关闭浏览器或使用不同 的浏览器, 均无法获取到cookie信息 c)可以通过setMaxAge(seconds)方法给Cookie设置最大存活时间. 设置后, Cookie会保存到本地硬盘中, 到期后自动删除.如果时 间设置为0, cookie会被直接删除. d)可以通过setPath(uri)方法给Cookie设置访问路径, 设置后只有 访问固定路径时, 才会携带Cookie信息

利用FIDDLER工具进行session和cookie欺骗

利用FIDDLER工具进行session和cookie欺骗 Agileone登录捕获: 选中post请求,在内容中修改密码并执行。 将password=admin,改成password=123,显示结果如下: 在textview中,结果反馈为password invalid。 进行session欺骗:把登录后的任意一个请求的sessionIDcopy到登录get请求内容中,结果响应出已经进入到登录后的首页,和首页中的源文件一样。如图,

请求内容: GET http://localhost/agileone/ HTTP/1.1 Host: localhost Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 Cookie:PHPSESSID=68aa4b8855d4e704dce53b23eb9a5c92;PHPSESSID=4766b699b16758c0ce 8eca2756a3a459; Cookie欺骗操作同理。

Java中设置session的详细解释

Java中设置session的详细解释 一、术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction和session在某些语境下的含义是相同的。 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程能称之为一个session。有时候我们能看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,他可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。 然而当session一词和网络协议相关联时,他又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,和此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间能互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或“一个POP3 session”③。 而到了web服务器蓬勃发展的时代,session在web研发语境下的语义又有了新的扩展,他的含义是指一类用来在客户端和服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”⑤。由于各种用于web研发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session 也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。 鉴于这种混乱已不可改动,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。 在本文中,使用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表达含义⑤,使用具体的“HttpSession”来表达含义⑥ 二、HTTP协议和状态保持 HTTP协议本身是无状态的,这和HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或一个普通的(非会员制)大卖场之间的关系相同。

对java中cookie和session的一些简介

1 课程回顾 Servlet编程 1)Servlet生命周期(重点) 构造方法:创建servlet对象。默认情况下,第一次访问servlet对象时。只调用1次。 init方法(有参):创建完servlet对象后调用。只调用1次。 注意:会调用无参的init方法。 service方法:servlet提供服务的方法。每次发出请求调用。 注意:request对象,response对象 destroy方法:tomcat服务器停止或web应用重新部署,servlet对象销毁,destroy方法被调用。 2)ServletConfig对象 获取servlet的初始化参数: getInitParameter("name "); getInitParameterNames(); 3)ServletContext对象 得到web应用路径: context.getContextPath(); request.getContextPath(); 等价于上面的代码 得到web应用参数: context.getInitParameter("name"); context.getInitParameterNames(); 域对象: context.setAttribute("name",Object): 保存数据 context.getAttribute("name") 得到数据 context.removeAttribue("name") 清除数据 转发 context.getRequestDispatcher("路径").forward(request,response); request.getRequestDispacher("路径").forward(request,response); 等价于上面的代码得到web应用中的资源文件 context.getRealPath("路径") context.getResourceAsStream("路径"); 今天的目标:会话管理 // 代表java命令运行目录,java运行命令哪里? 服务器启动的目录,tomcat/bin 到底在什么环境下运行,用.在java和entete不一样。Java和tomcat的不一样, 用这个方法, 2. 会话管得到web应用中的资源文件 context.getRealPath("路径") context.getResourceAsStream("路径");

https://www.doczj.com/doc/705751358.html, Application,Session,Cookie和ViewState等对象用法和区别

https://www.doczj.com/doc/705751358.html, Application,Session,Cookie和ViewState等对象用法和区别 在https://www.doczj.com/doc/705751358.html,中,有很多种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache 等。下面分别介绍它们的用法和区别。 方法 信息量大 小 作用域和保存时间应用范围 保存位 置 Applic ation任意大小整个应用程序的生 命期 整个应用程序/ 所有用户 服务器 端 Cach e 任意大小可以根据需要设定 整个应用程序/ 所有用户 服务器 端 Sessi on 小量,简单 的数据 用户活动时间+一 段延迟时间(一般为20分 钟) 单个用户 服务器 端 Cooki e 小量,简单 的数据 可以根据需要设定单个用户客户端 Views tate 小量,简单 的数据 一个Web页面的生 命期 单个用户客户端 隐藏域 小量,简单 的数据 一个Web页面的生 命期 单个用户客户端 查询字符串 小量,简单 的数据 直到下次页面跳转 请求 单个用户客户端 1.Application对象 Application用于保存所有用户的公共的数据信息,如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnStart事件(global.asax)中完成.尽管使用Application.Lock和Applicaiton.Unlock方法来避免写操作的同步,但是它串行化了对Application对象的请求,当网站访问量大的时候会产生严重的性能瓶颈.因此最好不要用此对象保存大的数据集合. 下面我们做个在线用户统计的例子来说明这个问题:

Cookie和会话状态的工作原理及Cookie欺骗

存在两种类型的cookie: Session cookies - these are temporary and are erased when you close your browser at the end of your surfing session. The next time you visit that particular site it will not recognise you an d will treat you as a completely new visitor as there is nothing in your browser to let the site k now that you have visited before 不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。 Persistent cookies - these remain on your hard drive until you erase them or they expire. How long a cookie remains on your browser depends on how long the visited website has program med the cookie to last 设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。 存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。 Cookie和会话状态的工作原理及Cookie欺骗 session是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以Cookie或URL重写为基础。默认使用Cookie 来实现,系统会创造一个名为JSESSIONID的输出Cookie,或称为"Session Cookie",以区别Persistent Cookies(通常所说的Cookie).Session Cookie是存储在浏览器中,并不是写在硬盘上的,但是把浏览器的Cookie禁止后,使用response对象的encodeURL或 encodeRedirectURL 方法编码URL,WEB服务器会采URL重写的方式传递Sessionid,用户就可以在地址栏看到 jsessionid=A09JHGHKHU68624309UTY84932之类的字符串。 通常Session Cookie是不能跨窗口使用,当用户新开了一个浏览器进入相同的页面时,系统会赋予用户一个新的SessionID,这样信息共享的目的就达不到,此时可以把SessionID保存在Persistent Cookie中,然后再新的窗口中读出来,就可以得到上一个窗口的SessionID了,这样通过Session Cookie和Persistent Cookie的结合,实现了跨窗口的会话跟踪。 session的工作原理 就session的实现而言,好像是这样的: (1)当有Session启动时,服务器生成一个唯一值,称为SessionID(好像是通过取进程ID的方式取得的)。 (2)然后,服务器开辟一块内存,对应于该SessionID。 (3)服务器再将该SessionID写入浏览器的cookie(一些在网页的源代码中有所体现)。

Session和Cookie的作用以及实现

Session和Cookie的作用以及实现 最近学习Session和Cookie的总结,我发现好多做测试的朋友对这个的理解不是那么透彻;如果理解了Cookie和session的原理和使用,在我们的测试工作中,有很大的帮助;尤其是在接口测试,性能测试中。。。 我把下面的内容做成了一个pdf文档,有需要看的朋友,可以去百度云盘下载,地址在文章的最后: 内容如下: 一、为什么要用Cookie和Session? 很多时候客户端和服务器进行交互使用了HTTP协议,但是HTTP协议是无状态的;HTTP协议的请求过程,是基于TCP/IP 的,当客户端请求服务器,服务器处理后,进行响应,该过程是无状态的。 但是在有些时候是需要保存一些客户端的请求信息,识别客户端的某些状态,智能的、有针对性的去分析某些客户端的习惯。这些时候,就需要去记录客户端的连接状态,识别请求的状态等。所以为了解决类似的事情,就需要使用到了Cookie 和Session。 比如,使用Cookie的场景:有些网站有记住用户名的功能,当你勾这个的时候,下次进入该网站时,就会保存上一次登录的用户名;使用Seesion的场景:利用Seesion来验证用户是否已登录,利用Session来保存验证码。 二、Cookie和Session是什么? (1)Cookie:在客户端访问某个地址时,会将请求交到服务器进行处理,在发送请求的时候,浏览器会将页面的头部信息一并的交到服务器端进行处理。在处理的过程中,Cookie 在服务器端生成,在此同时,可以将一些需要保存的信息,存放到此Cookie 中。生成Cookie 对象时,需要确定具体的名称及具体的值,可以设置当前Cookie 的过期时间,设置过期时间后,就相当于持久化了Cookie 中的数据,此时的Cookie 会以之前的Cookie 名称,保存在客户端。 如果不设置过期时间,则当前Cookie 的生命期是浏览器会话期间,一旦关闭了该浏览器,当前的Cookie 就会不存在了,此时的Cookie 信息是保存在内存中。在服务器端,处理完后,会将生成的Cookie ,随着Http 响应,会在Http 响应头中,加上Cookie 信息,浏览器接受到响应后,会按照Http 响应头里的Cookie ,在客户端建立Cookie 。在下次客户进行请求的时候,Http 会附带着已经存储过的Cookie,一并发送到服务器。一个域,在客户端建立的所以Cookie 都是可以共享的,只要Cookie 没有过期。 (2)Session:Session 是在服务器端生成的,存储在服务器端,即存在内存中。可以对生成的Session 设置过期时间,如果不设置过期时间,默认的Session 过期时间是30 分钟(在不同的服务器中,它的过期时间略有不同,本文是以Tomcat 来说的)但是,Sesssion 的生成的同时,会生成一个与之相关联的的SessionID ,此SessionID 的存储是需要Cookie 来完成的。SessionID 是以名称为JSESSIONID,其值应该是一个既不会重复,又不容易被找到规律以仿造的字符串。SessionID会随着此次Http 响应,一并返回到客户端,并保存在客户端中。到当前请求再次发出后,该SessionID会随着Http 头部,传到服务器中,服务器依据当前SessionID 得到与之对应的Session. 其中:通过Cookie 的方式存储Session 状态,只是其中一种方式。如果客户端禁用了Cookie 的话,很多网站任然可以存储用户的信息。一种处理的方式是URL 重写,将SesseionID 直接附加在请求地址的后面。另一种处理的方式是,使用隐藏自动的方式。就是服务器自动的在表单中,添加一个隐藏字段,以便在表单提交时,将SesseionID 一起传到服务器,进行识别。 (3)总结下:Cookie是存在客户端的,比如我们电脑的本地文件中(设置的过期时间的话),在我本地的话(C:\Users\xxx\AppData\Roaming\Microsoft\Windows\Cookies): 也可以在浏览器中看(chrome): Session是存在服务器端的(我的apche也安装在本地的):

10分钟让你区分Session和Cookie区别

Session Session定义 一般被翻译为‘会话’,具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。 session工作原理 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(来保存信息。 当客户端请求创建一个session的时候,服务器首先检查客户端请求里是否已包含了一个session标识session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用。 如果客户端请求不包含session id,则为此服务器创建一个session并且生成一个与此session相关联的session id。session id的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie。一般这个cookie的名字都是类似于SEEESIONID。 比如: JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。 由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写。 就是把session id直接附加在URL路径的后面,附加方式也有两种: 1.一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK ... 99zWpBng!-145788764 2.另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK ... 99zWpBng!-145788764 这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。 为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。 另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。这种技术现在已较少应用。 有一种一种误解:“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session 来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭。

Session&Cookie 笔试题及答案

String username = "1234567899"; String regex1 = "^[a-zA-Z0-9]{5,12}$"; String regex2 = "^\\w{1,}[@]\\w{1,}[.]\\w{1,}[.]?\\w{1,}$";//email 写法 String email = "^[a-zA-Z0-9_-]+[@][a-zA-Z0-9_-]+((.com)|(.net))$"; String regex4 = "^\\w{1,}(.com|.cn)$"; String regex3 = "^\\d{3,4}[| -]?\\d{7,8}$";//电话号码,空格不能在最后 String userReg = "^[a-zA-Z0-9_]{5,12}$"; // 用户名5-12位 字母数字,_ String numberReg = "^\\d{6,8}$"; // 6-8位数字 String fpReg = "^[0-9]+[.]?\\d*$"; String telReg = "^(\\d{1,3}[-| ]?)?" + "\\d{3,4}[-| ]?\\d{7,8}[-| ]?(\\d{3,4})?$"; servlet 一、cookie 机制和session 机制的区别 具体来说cookie 机制采用的是在客户端保持状态的方案,而session 机制采用的是在服务器端保持状态的方案。 同时我们也看到,由于在服务器端保持状态的方案在客户端也需要保存一个标识,所以session 机制可能需要借助于cookie 机制来达到保存标识的目的,但实际上还有其他选择。 二、会话cookie 和持久cookie 的区别 如果不设置过期时间,则表示这个cookie 生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了。这种生命期为浏览会话期的cookie 被称为会话cookie 。会话cookie 一般不保存在硬盘上而是保存在内存里。 如果设置了过期时间,浏览器就会把cookie 保存到硬盘上,关闭后再次打开浏览器,这些cookie 依然有效直到超过设定的过期时间。 存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE 窗口。而对于保存在内存的cookie ,不同的浏览器有不同的处理方式。 三、如何利用实现自动登录 当用户在某个网站注册后,就会收到一个惟一用户ID 的cookie 。客户后来重新连接时,这个用户ID 会自动返回,服务器对它[abc] a 、b 或 c (简单类) [^abc] 任何字符,除了 a 、b 或 c (否定) [a-zA-Z] a 到 z 或 A 到 Z ,两头的字母包括在内(范围) [a-d[m-p]] a 到 d 或 m 到 p :[a-dm-p](并集) [a-z&&[def]] d 、e 或 f (交集) [a-z&&[^bc]] a 到 z ,除了 b 和 c :[ad-z](减去) [a-z&&[^m-p]] a 到 z ,而非 m 到 p :[a-lq-z](减去) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w]

TOMCAT中SESSION与COOKIE的深度探索

TOMCAT中SESSION与COOKIE的深度探索(续) 由于业务需要,昨天稍微研究了一下tomcat处理session的机制,对此有了更为深刻的理解,现在记下来,供大家参考和讨论。 大家也许都了解,tomcat为了维持和浏览器之间的session对应关系,主要采用三种方式:1.cookie纪录sessionId; 2.url重写; 3.隐藏表单,这个几乎和url重写意义相同; 之前,我一直非常相信浏览器的cookie,即便浏览器端关闭了cookie,也相信tomcat会自动帮忙重写url,但是进入到wap这行后,cookie就不敢那么恭维了; 有些手机浏览器就只能保持一个cookie,并且对于cookie的维护性极差到一定地步,例如在“/”根目录下的sessionId存储与路径为“/”的cookie中,而遇到“/a/”的情况,由于手机浏览器只能保持一个cookie,它居然愚蠢到将这个cookie里的sesionid等同于“/”中的sessionid,就不再纪录了,也就是说“/a/”中的sessionid强制和“/”中的一样,并且每次访问“/a/”中的sessionid和“/”的一样; 大家都知道,对于很多时候“/”和“/a/”的目标路径,几乎不在同一个服务,甚至不在同一台服务器上,这点令我很是郁闷。 为了这个,我为每个链接的后面就加上了sessionid,这样居然还是不行,后来我查看了许多tomcat相关的文档,在配置文件的context中有个cookies选项,如果配置为false,则不信任浏览器的cookie,只信任url后面的jsessionid,但是公司的服务很大很杂,如果我更改了这个选项,怕影响到其它服务,最妥协的办法就是让tomcat先选择url后面的sessionid,如果没有再去cookie中去找,但是我没有发现这样的配置选项; 于是乎我查看起了tomcat的源代码,后来发现CoyoteAdapter类中对于sessionid的处理是这样的,显示运行parseSessionId(req, request),这个方法是在url中获取sessionid作为requestedSessionId,在同一方法的最后运行parseSessionCookiesId(req, request),这个方法负责在cookie中获取sessionid,这个方法之前会判断,如果配置中禁止cookie,则不取cookie 中的了,也就是说无法优先选择url中的sessionid,只能选择或不选择cookie的:(这样对于复写tomcat代码的梦想也几乎覆灭了,于是只能执行强加手段了。 由于cookie中的sessionid是通过协议的head头传给服务器的,于是在apache中,强制改写head头,使“/”目录下的sessionid在访问"/a/"的时候强制实效,才解决了这个问题。 纵观事件,难道我们就只能采取妥协的或者强制的方法才能解决一些郁闷的问题吗?呵呵(苦笑ing) 不知道大家有没有好的办法解决cookie和session的问题,有多少辛酸,大家都说说吧。 TOMCAT实现的cookie小结 返回myqueue首页| 更多的IT技术文章| 评论(0) | 得分(0.00) 发布于:2006-10-10 浏览次数:156 正常的cookie只能在一个应用中共享,即一个cookie只能由创建它的应用获得。 1.可在同一应用服务器内共享方法:设置cookie.setPath("/"); 本机tomcat/webapp下面有两个应用:cas和webapp_b, 1)原来在cas下面设置的cookie,在webapp_b下面获取不到,path默认是产生cookie 的应用的路径。 2)若在cas下面设置cookie的时候,增加一条cookie.setPath("/");或者

相关主题
文本预览
相关文档 最新文档