a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 342|回复: 0

[专业语言] Java认证:cookie技术在J2ME平台的应用

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证:cookie技术在J2ME平台的应用6 ~8 z1 \$ p) n, |- `
本文向大家简单介绍一下cookie技术在J2ME平台的应用与实现,首先,我们来看一下cookie的原理。当服务器需要和浏览器维持某一状态的时候,例如需要记录用户的购物车中已经购买的商品。这时候服务器可以新建一个Cookie并把它写入到响应中,浏览器从响应中接收到cookie并保存起来。
" r/ ]) y! T! z+ A* r. ~, }cookie技术在J2ME平台的应用与实现: [$ p) Q* X8 P. b1 z2 ?
Cookie在Web应用程序中被广泛采用,维护浏览器和服务器之间的状态。遗憾的是这一特性在JavaME平台中并没有得到支持。因此,要想维持客户端和服务器端的状态则必须使用URL重写的方式。URL重写操作起来比较麻烦,所以研究一下cookie的原理并在JavaME平台上实现cookie是不错的尝试。
5 h& n' |' m1 ^. }' B首先,我们来看一下cookie的原理。当服务器需要和浏览器维持某一状态的时候,例如需要记录用户的购物车中已经购买的商品。这时候服务器可以新建一个Cookie并把它写入到响应中,浏览器从响应中接收到cookie并保存起来。当浏览器再次向服务器发送请求的时候,浏览器会根据域(domain)和路径(path)检查是否有匹配的cookie,如果有则把cookie以“名称=值”的形式发送给服务器,服务器从请求中解析出cookie就知道用户的状态了。
0 R5 J( D6 [+ V" A3 J# Q1 [7 t5 P$ e7 \那么,浏览器根据什么规则来决定向服务器发送cookie呢,首先要匹配domain,如果cookie的域属性是。google.com,那么请求指向j2medev.com的时候,cookie就不会被发送。如果域匹配的条件满足,则判断path是否匹配,如果cookie的path属性是请求的uri的父目录的话,那么cookie就会被发送给服务器。Cookie是有存活周期的,到期的cookie会被浏览器自动清除。如果服务器创建cookie的时候不设置生命周期,那么在会话结束后浏览器就会删除cookie.如果不为cookie指定path属性,那么默认就是这次请求的路径。
3 w+ C4 K+ o8 Hcookie在很多web应用程序中都有应用,比如记住密码,购物车等。在开发MIDlet的时候,你也可以让你的应用程序支持cookie,这样维持客户端与服务器端的状态将变得简单,为你集中精力解决其他业务方法奠定了基础。既然已经知道了cookie的工作原理,那么就应该考虑一下在JavaME平台如何实现cookie,这个想法是否可行。我将从下面三个方面进行分析。% t9 C5 M7 Y, c$ {3 q# H) B
第一:获得cookie
( m. T" t4 \9 A4 y+ [' h当服务器端的响应到来的时候,我们应该能够读取cookie.如果服务器向客户端写入Cookie的时候,响应中的HTTP头“Set-Cookie”中会包含一个字符串,代表了cookie的信息。幸运的是我们是用HttpConnection.getHeaderFiled(“Set-Cookie”)方法即可获得cookie,但是需要注意这里只是读取了一个cookie,如果响应中包含了多个cookie,那么你需要循环读取。类似于下面的代码:
3 |- h9 m/ ]% B4 P8 {/ x  YStringsCookie=null; Stringkey=null; inti=0; //如果key存在,则查询header的key,如果key等于SET_COOKIE,则存储 while((key=connection.getHeaderFieldKey(i))!=null){ if(key.equals(SET_COOKIE)||key.equals(SESSIONID)){ sCookie=connection.getHeaderField(i); saveCookie(sCookie,url); } i++; }8 d  }( R2 a" I( o& \
上面的代码把header是Set-Cookie和SesssionID的cookie内容读取下来。
0 f% M5 V" `# n' r: j& m
7 k4 v# R2 n* }! x. G* h; n
9 f$ y! L$ t$ M( B9 T7 X第二:保存cookie! ]! M9 z3 |/ F! V' D
已经获得了cookie之后,就需要把cookie存储下来,存储分为两个部分,首先需要解析cookie,我们定义一个JavaBean来代表cookie.
& \( g: V4 U& x. vpackagecom.j2medev.lomol.model;
& A. P, b8 a2 H- S6 Y6 timportcom.j2medev.lomol.util.StringUtil;$ ~  k# X- Y9 ?+ Y% _6 l
importjava.io.DataInputStream;. c3 J( ~( \: h
importjava.io.DataOutputStream;
; d+ y, R( l; y/ {+ E8 Z' @importjava.io.IOException;
. L! n! _& z3 W% Simportjava.util.Date;0 Q. L$ r" N  h: Q: l/ g
/** *acookiestoredonthemobiledevice,8 [( ~5 W( _7 @0 Q' G
cookieisusedtomaintainthestatesbetweenclientandserver; f8 b. l5 A4 j3 N- P; w: C$ z  ]
*@authormingjava/ @, \; A6 e3 U* Y
*@version0.105/06/2006
- `; `9 W4 k/ p6 z; [*/" U; ^3 j. Z6 e0 I* Y  Q  D
publicclassCookie{
; b$ ?) O0 c# S2 t# R  ?privateStringpath=“”;
( S( F: B1 ~( z& F& s4 Q" CprivateStringname=“”;6 P6 e& t1 D, k# L  e0 _% w; Q
privateStringvalue=“”;
# u' r: b6 @2 x" a& uprivatelongexpire=SESSION_COOKIE;8 k( A! Y  Z2 L# {( O5 q& C
publicstaticlongSESSION_COOKIE=0;: q1 g$ k/ b2 K8 E3 U: m8 h
//sessioncookie,onlyvalidthissession
4 X5 Z1 Z3 S1 k' vpublicCookie(){ }
7 j3 S) W8 o, T( F+ c5 x" dpublicStringgetPath(){ returnpath; }
6 w. f0 O/ D: |! d6 R: ^8 m( F' ]publicvoidsetPath(Stringpath){ this.path=path; }
6 g! R" f+ T; s2 a8 I# v' E+ Q2 ?' A0 KpublicStringgetName(){ returnname; }
- E/ t5 }2 \6 q) K" @publicvoidsetName(Stringname){ this.name=name; }9 Z6 b+ C/ c* j1 U  O  W& D& `
publicStringgetValue(){ returnvalue; }
# U% M/ N) K! V$ D& `publicvoidsetValue(Stringvalue){ this.value=value; }
- h6 w* H+ I9 {, O) z1 jpublicvoidserialize(DataOutputStreamdos)! B# o1 k4 l* _( v) Q
throwsIOException{
  V1 X+ O- A7 Ydos.writeUTF(name);
; Q# J2 X* b- ados.writeUTF(value);' X2 L3 C' ]' o4 _# B# W
dos.writeUTF(path);
' a+ i+ |. [! ?/ |1 G' Rdos.writeLong(expire);
8 |, S- f. F3 Q2 o}
2 m7 q, s* N5 opublicstaticCookiedeserialize(DataInputStreamdis)throwsIOException{
, [; s; u' E  F! T5 r% Y' ECookiecookie=newCookie();
; p- I% g9 c9 q  [cookie.name=dis.readUTF();8 z& H" b  A* o7 r. n# g; ^
cookie.value=dis.readUTF();6 Y9 l/ B; N) R: z; C
cookie.path=dis.readUTF();$ t- \- j1 v: w" h( W
cookie.expire=dis.readLong();
( N& j; q! q0 r5 P( H- x5 V" Wreturncookie;
, X' V9 [" w9 o+ k}7 `; j, m" E- D( |
publiclonggetExpire(){  T1 a5 C* `& {
returnexpire;
$ Z4 N' M' @0 ~( T' {% u1 I2 [# O}
$ U. |; b; I: q( L+ A: W* spublicvoidsetExpire(longexpire){ this.expire=expire;
. j' F  l, J  a4 Z, {: |$ y1 H}9 X3 K4 w; p3 u) O2 K& y
//fordebug2 I& L6 u9 z# V/ z; i
publicStringtoString(){8 P* o2 N# \8 h; T! P* M8 W, F
returnname+“=”+value+“;expires=”+newDate(expire)。
. o% j: B) B% K0 d) c8 YtoString()+“;path=”+path;
# k4 u6 p+ f% k$ u  m" d1 f}0 x  L' Z9 A5 S1 V& X2 x
publicbooleanisExpired(longnow){& F1 s6 l; x9 X7 M% D1 Y
returnexpire-now《0;
* l9 f/ S! B. A8 O: E2 T}2 M6 B0 |' q+ G4 a, r' s* p, }; o' ?
publicbooleanisExpired(){3 n/ Q& B% a9 R5 V2 }8 W6 c
returnexpire-(newDate()。getTime())《0;, W: ]) l% ~3 t
}( L/ _7 j& t4 m" p$ }
publicstaticCookieparseCookie(Strings,Stringuri){
: G+ O* a% l, G  t( I) X; j4 XCookiecookie=newCookie();
' X) H) Q; ^% }2 UStringUtilsu=newStringUtil(s,“;”);3 X- q" O/ ^1 k2 E, N: W
while(su.hasMoreTokens()){) h9 q1 j5 k7 z- J' w
Stringstr=su.nextToken()。trim();
- z- O  G* P0 o& Sinti=str.indexOf(“=”);& P; I3 M8 e* b9 M! \) f
3 D( J. B2 |5 u0 {

& ~# C" g- P. K% T1 J& ~if(i==-1){
: `1 y  T% o4 b//securedonothing continue;( {( q+ V2 D( t  x3 ^) T
}else{3 c$ }4 @9 ^0 b) @. d
Stringname=str.substring(0,i);; R9 D9 V$ L, q. U/ G; Z* o1 L* E
Stringvalue=str.substring(i+1,str.length());) \" z7 W# ^. h5 h( T8 P9 Y* }4 T0 V
if(“path”.equals(name)){* T) I9 P) ]. q
cookie.setPath(value);
2 o! @0 y6 X0 b! }5 R: D( ~}elseif(“expires”.equals(name)){, r0 l: M. |' n
cookie.setExpire(StringUtil.getData(value));
6 W: c1 v3 l) k( T" }" ^}elseif(“domain”.equals(name)){
" [) P) O3 Q# S% r9 p//donothing }else{; ~3 V! v" `$ s3 k; a
cookie.setName(name);& k, ^7 h8 ?; j# @3 j- O3 t" V
cookie.setValue(value);2 R1 s; k1 G; }! G! \( Q
}; @7 _2 y/ }) W& ], I7 d5 g
}0 C0 h+ W- o! M/ H
if(cookie.getPath()。equals(“”))6 ]5 w/ d, l" ]. U8 x9 Y
cookie.setPath(uri); } returncookie; }3 D2 j5 H: {% f8 s
publicbooleanequals(Objectobj){' o  ]4 j& I: U1 ]# O
if(objinstanceofCookie){ Cookieo=(Cookie)obj;
8 X. a% t+ ?* c/ c$ k$ I& I5 L" sif(o.getName()。equals(name)&&o.getPath()。equals(path))
' X' N. {+ ]: Q$ p% S, y, Greturntrue; } returnfalse; }
1 k% l! i- ?5 f2 h5 c4 k# C  C3 R# bpublicinthashCode(){ intresult=17;
4 d& A3 j1 P# L$ ~resultresult=result*37+path.hashCode();
. f( p: }! _. w3 A' Kresultresult=result*37+name.hashCode();3 F/ e7 H0 _4 D+ `) O+ L
returnresult; } }
& k: g: P+ S9 v3 a( R: k提供了一个parseCookie方法来解析cookie,具体的原理就不再介绍了。然后需要把这个Cookie对象存储到RMS中。cookie并不大,所以不会占用太多的空间,在RMS中存储非常合适。注意对于会话期间的cookie没有必要存储在rms中,因为会话结束后就失效了,不如在内存中声明一个Map来存储会话类型的cookie.第三:发送cookie
  L* g5 ^! L5 z  z2 d7 S0 P发送cookie也是需要两个步骤,首先检索rms和内存看是否有满足条件的cookie,如果有读取出来。# ~# i; ]% s, D7 G5 T6 ?! F" ]1 X
然后通过下面的方法向服务器端发送
# P6 W$ C1 t. ^' C7 i3 D& z//检查是否有cookie需要发送给服务器端$ r* m2 N* z% P
String_cookie=collectCookie(url);
6 E) |4 m. _0 X3 F2 t4 g- C( Bif(_cookie!=null)- f* y5 E1 H7 }" t. ^6 p
connection.setRequestProperty(COOKIE,_cookie);
7 }3 p2 b# h8 ~2 U! u如果能够顺利解决上面的三个步骤,基本可以实现cookie在javame平台的应用。在《JavaME核心技术与最佳实践》一书中,本人编写了一个httpme联网框架,其中包括了cookie在javame平台的实现,供大家参考。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 16:48 , Processed in 0.232742 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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