a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 310|回复: 0

[专业语言] Java认证:对session和cookie的一些理解

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证:对session和cookie的一些理解: r" M' q7 G$ [, T6 P5 I
对session和cookie的一些理解' O/ Z4 i7 Z/ w& O/ {% M* c' V  r! g( [! \
一、cookie机制和session机制的区别! x. S8 y) W5 I6 x+ ^* u/ w4 y& O
*************************************************************************************
9 B' I! G1 y. R; q具 体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于才服务器端保持状 态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择,比如说重写 URL和隐藏表单域。' |4 ^0 M# X2 L* Y8 Q( e
*************************************************************************************& f2 [0 ?# u' l5 J6 H! \
二、会话cookie和持久cookie的区别! }/ ^1 w$ |9 m% N  ]
*************************************************************************************
* i" \, Y( Y) n, T% N& C1 x8 W如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
+ p. q2 j& K" H' U  ?/ X如果设置了过期时间(setMaxAge(60*60*24)), 浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同 的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。(在IE下测试通过)
: Y2 [: e' t- I( ?' d+ e*************************************************************************************
& r# B  V. ^! p5 z! Q+ T5 Z三、如何利用实现自动登录  a4 d. K) E7 q6 O
*************************************************************************************
5 \' l: f, k4 ?6 u8 F0 Q( s, N, k当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。! U( P5 {( o" A8 _" g1 @$ ?3 |
*************************************************************************************
% i* z( j5 {) {. G9 X; M& [四、如何根据用户的爱好定制站点
2 `- C( t& k/ e*************************************************************************************1 j3 F% q3 A( ?! ^! R, ?% q( u
网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。. ?, u( G; p# q6 i# E
*************************************************************************************: e7 Y+ N! f  @7 z# H$ O5 ]( A- U
五、cookie的发送7 E9 N* q3 k( P' N4 d
*************************************************************************************# W) Z# n! P7 S* S# v% a2 P1 ?
1.创建Cookie对象/ g! J* m% J1 q7 z, \8 a
2.设置最大时效1 N% `% G# s$ B, T" g0 l
3.将Cookie放入到HTTP响应报头1 _' V: z- K; b2 q- F
如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中(服务器自动创建一个 cookie并将jsessionId作为key,sessionId的值作为value发送到客户端浏览器内存中),用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而非 setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。
/ f2 e( n  @3 N; Q7 m5 _9 [% N
0 ]$ ^* r; L& l0 E5 C, T六、cookie的读取% q) L3 O' Q& Q
*************************************************************************************6 g" I5 F" Y0 l. H8 D+ g7 p/ q
1.调用request.getCookie
% c5 c* [2 l+ i" m要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。
: j$ b/ b4 a! h4 z0 S; P2. 对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止,cookie与你的主机(域)相关,而非你的 servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。8 H/ n0 N: {4 u+ h) H$ z. I( [
例如:(login.jsp页面cookie实现用户名userName填写)& S. k$ Z" j) y) f1 k
login.jsp:
% F+ j4 }+ U9 ~" W《%
1 l. U  j# D3 q, ~% ^) ^String username = “”;
3 g" T6 g% V: x# q# n) w4 J$ N//从客户端读取硬盘中的cookie文件
* w* M6 V* R9 Q) f# OCookie[] cookies = request.getCookies();% B$ e+ G  j$ T7 [
if(cookies == null){! c; D9 L2 q! H' V2 J: e
username = “”;+ f9 M5 _- a8 ]& x# x. T
}
. ~. _7 k2 h, U; gelse{
2 ]2 x' h, c$ M3 R0 O4 V; vfor (int i = 0; i 《 cookies.length; i++){
. f* M' Q9 r5 Q0 W! y) [( k" X& Cif (“USERNAME”.equalsIgnoreCase(cookies[i].getName())){
/ ]6 c0 P+ y. ^& L' Musername = cookies[i].getValue();6 d$ t& ^. Q2 s: H* V5 u7 l
}
: d% X, ^+ ~- x}
  s) \$ E# E! S% U. ~6 Z  \; \%》7 X. b% ^( P, a, t
《form name=“login” method=“post” action=“login.do”》
" ^9 f2 e+ o9 D《td width=“100%” bgcolor=“#CCCCCC” colspan=“2”》
6 b9 R# ~" T+ w) i《p align=“left”》用户名《br》: W; [1 e6 y) t- B3 x
《input type=“text” name=“username” value= “《%=username%》”》
1 x9 D& m5 Z/ g& W- D' ?+ Q《/p》# C+ `3 r( l; l% Q. {2 C% V
《p align=“left”》密 码 《br》* v8 Z1 S; q! P4 k7 }( l
《input type=“password” name=“password”》
! f4 S, r9 U+ G2 J9 @《/p》" u( e6 d4 m/ p- z! a  n, }6 ]' T
《p align=“left”》& [+ {% k+ g' I" ~# W
《input type=“submit” name=“Submit” value=“确定”》  N+ e. c# p7 a6 f; k8 a1 ?8 W
《input name=“reset” type=“reset” value=“取消”》
5 ]; y% y9 x& E  \4 y《/p》
* T. D9 D9 p$ T《/form》
0 H+ Z0 }* j* ]% t1 }- ?LoginAction:8 e$ Q3 i' m3 H* o  K& i
//将正确userName放入c1对象,并用“USERNAME”做key标识
! E3 L( N2 P- n, mCookie c1= new Cookie(“USERNAME”,logindto.getUsername());
8 b1 L2 F6 {, M3 H) F% \//如果不设置时间,则cookie为会话cookie,不写入客户端硬盘
6 d% t2 f  \' m4 j& Z" X2 Kc1.setMaxAge(60*60*24);
8 J: T$ d& Y2 K0 @/ qresponse.addCookie(c1);% F6 c$ g, z0 d  f% n% |) f
*************************************************************************************
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-27 11:46 , Processed in 0.517984 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表