a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 359|回复: 0

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

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证:对session和cookie的一些理解
! g( \& [% V) L( X( ?% U  T对session和cookie的一些理解, {+ E, P, _# N& F- C/ R1 Y
一、cookie机制和session机制的区别9 e8 O8 W5 E) K- Y: i
*************************************************************************************& S2 m2 G# p% X
具 体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于才服务器端保持状 态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择,比如说重写 URL和隐藏表单域。9 M/ J* ?0 n3 g! z+ i, r6 ~8 m  U
*************************************************************************************
( |! f, [* k: N7 E. ?/ M二、会话cookie和持久cookie的区别
/ _2 U" J$ {4 Y/ a4 d*************************************************************************************$ r& B7 [. V* P2 k
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
2 c4 ?6 E) m8 p0 V' @2 A+ d如果设置了过期时间(setMaxAge(60*60*24)), 浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同 的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。(在IE下测试通过); h4 @9 h7 G0 ]" s/ O
*************************************************************************************
1 w7 h1 B( i& U& X3 S三、如何利用实现自动登录3 g/ s, K- J6 y( ~" v) k
*************************************************************************************, u0 l& P; I! v* a
当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。  I/ D& c0 @, O$ M  d, e
*************************************************************************************$ b/ E8 V1 H* n7 ]: ?8 o
四、如何根据用户的爱好定制站点
" t- s! K0 ~8 v4 c*************************************************************************************
. G2 f" z7 ]/ |- x% k' o网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。
3 Z# [: X$ g8 r2 y- P*************************************************************************************) f: t3 ?% ], K* k$ l
五、cookie的发送
- K+ v& `( k( B' C4 d*************************************************************************************
* Z7 c. F2 m) q& B3 [$ t! N/ c1 H1.创建Cookie对象$ J' ~8 z& b8 a1 f
2.设置最大时效4 n2 T8 h$ n& d( |; {/ M$ {
3.将Cookie放入到HTTP响应报头0 ^3 b9 y9 l# j
如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中(服务器自动创建一个 cookie并将jsessionId作为key,sessionId的值作为value发送到客户端浏览器内存中),用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而非 setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。
- \. l% q" \8 h0 B% o
7 j9 O) M3 |0 L" X5 [0 t: K% l六、cookie的读取! O4 n( o; X5 _
*************************************************************************************
! g  {  W4 m& H( U9 g4 k1.调用request.getCookie
4 s8 c7 U4 j  r- x' |+ l要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。% g7 O. W5 K, N( S+ W9 i$ ^
2. 对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止,cookie与你的主机(域)相关,而非你的 servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。6 d" ^: t0 D4 `8 |! H. T! P+ U' L
例如:(login.jsp页面cookie实现用户名userName填写)
1 c/ T4 h- J- E* ]% @login.jsp:
2 x% x( E/ c4 P- t《%+ M) H% s& [  A; Y$ k* y
String username = “”;2 B* |* x% b# g; F4 ~& v& Z
//从客户端读取硬盘中的cookie文件( k- o& C  |1 g! x4 A
Cookie[] cookies = request.getCookies();. E. `$ e4 p' A& i: I; q* @
if(cookies == null){. I# O5 ?. H6 _. a. N# T
username = “”;
6 Y9 i  H' M" M* I1 o! @* w" m}& V2 b8 f/ V- N( F
else{
! a6 F2 \1 j: r) h& J  Qfor (int i = 0; i 《 cookies.length; i++){3 `9 P# `0 j% m8 L# h1 r
if (“USERNAME”.equalsIgnoreCase(cookies[i].getName())){
6 e' L0 f  ~! T  M$ P9 t1 D9 h" @username = cookies[i].getValue();
( q' r( F/ l0 }$ j}' J4 @% Z% [# B' |, p* w! u) g! g: X
}: y8 x6 z7 \! n; D3 T/ q# k; M
%》
% C& h( f- x9 Q* l/ Y$ _《form name=“login” method=“post” action=“login.do”》
% F8 R9 H8 |7 `, N《td width=“100%” bgcolor=“#CCCCCC” colspan=“2”》4 u" t  h) R5 Y2 Y3 q" {
《p align=“left”》用户名《br》
4 i/ ?! h2 b$ E& s7 a《input type=“text” name=“username” value= “《%=username%》”》% L# \% ~+ d/ Y' f) a' N: ^
《/p》
- I* P+ d0 M: |! W3 R9 z& F《p align=“left”》密 码 《br》" J. m4 _- R9 g7 z* S8 a6 }5 F, a7 L
《input type=“password” name=“password”》
* B% t5 _1 P8 S  _% a" p《/p》6 ~0 ~9 i  H" Z! w6 d' m6 O
《p align=“left”》
5 n. D( T4 ?6 c3 O' a6 Y: E1 R《input type=“submit” name=“Submit” value=“确定”》. X5 y% I7 T: J5 ?  J0 f
《input name=“reset” type=“reset” value=“取消”》7 [& G' ?( t: c6 B: s' U
《/p》& M9 r8 `8 p8 l1 E" I5 o
《/form》
- ~0 N# ~, [& H/ qLoginAction:0 y0 L) y4 P7 f# ^' A* L
//将正确userName放入c1对象,并用“USERNAME”做key标识
- v5 y2 [2 Z+ x% u$ @! b/ HCookie c1= new Cookie(“USERNAME”,logindto.getUsername());
* q! e- p' ]7 f! C, I6 @" U2 H1 W//如果不设置时间,则cookie为会话cookie,不写入客户端硬盘
8 i6 h3 x+ ^' ^4 @c1.setMaxAge(60*60*24);
. ~) Q- n- J2 p& Dresponse.addCookie(c1);
9 g0 z& W9 J2 e6 t*************************************************************************************
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-27 19:44 , Processed in 1.466196 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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