cookie技术在Java ME平台的操纵与实现[Java编程]
本文“cookie技术在Java ME平台的操纵与实现[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Cookie在Web利用程序中被遍及采取,保护浏览器和服务器之间的状况.遗憾的是这一特点在Java ME平台中并没有得到支持.因此,要想保持客户端和服务器端的状况则必须利用URL重写的方法.URL重写操作起来对比麻烦,所以研究一下cookie的原理并在Java ME平台上实现cookie是不错的尝试. 首先,我们来看一下cookie的原理.当服务器需求和浏览器保持某一状况的时刻,比方需求记录用户的购物车中已经购置的商品.这时刻服务器可以新建一个Cookie并把它写入到呼应中,浏览器从呼应中接纳到cookie并保存起来.当浏览器再次向服务器发送恳求的时刻,浏览器会按照域(domain)和途径(path)查抄能否有匹配的cookie,假若有则把cookie以“名称=值”的情势发送给服务器,服务器从恳求中解析出cookie就知道用户的状况了.那么,浏览器按照什么法则来决意向服务器发送cookie呢,首先要匹配domain,假如cookie的域属性是.谷歌.com,那么恳求指向j2medev.com的时刻,cookie就不会被发送.假如域匹配的条件满意,则判断path能否匹配,假如cookie的path属性是恳求的uri的父目录的话,那么cookie就会被发送给服务器.Cookie是有存活周期的,到期的cookie会被浏览器自动排除.假如服务器成立cookie的时刻不设置生命周期,那么在会话完毕后浏览器就会删除cookie.假如不为cookie指定path属性,那么默许就是这次恳求的途径.
cookie在很多web利用程序中都有利用,比方记着密码,购物车等.在开辟MIDlet的时刻,你也可以让你的利用程序支持cookie,这样保持客户端与服务器端的状况将变得简单,为你集合精神办理其他业务办法奠基了底子.既然已经知道了cookie的工作原理,那么就应当考虑一下在Java ME平台若何实现cookie,这个设法能否可行.我将从下面三个方面举行解析.
第一:得到cookie
当服务器端的呼应到来的时刻,我们应当可以读取cookie.假如服务器向客户端写入Cookie的时刻,呼应中的HTTP头“Set-Cookie”中会包含一个字符串,代表了cookie的信息.幸运的是我们是用HttpConnection.getHeaderFiled("Set-Cookie")办法便可得到cookie,但是需求注意这里只是读取了一个cookie,假如呼应中包含了多个cookie,那么你需求循环读取.近似于下面的代码
String sCookie = null;
String key = null;
int i = 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++;
}
上面的代码把header是Set-Cookie和SesssionID的cookie内容读取下来.
第二:保存cookie
已经得到了cookie之后,就需求把cookie存储下来,存储分为两个部份,首先需求解析cookie,我们定义一个Java Bean来代表cookie.
package com.j2medev.lomol.model;
import com.j2medev.lomol.util.StringUtil;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Date;
/**
* a cookie stored on the mobile device, cookie is used to maintain the states between client and server
* @author mingjava
* @version 0.1 05/06/2006
*/
public class Cookie {
private String path = "";
private String name = "";
private String value = "";
private long expire = SESSION_COOKIE;
public static long SESSION_COOKIE = 0;//session cookie,only valid this session
public Cookie() {
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public void serialize(DataOutputStream dos) throws IOException{
dos.writeUTF(name);
dos.writeUTF(value);
dos.writeUTF(path);
dos.writeLong(expire);
}
public static Cookie deserialize(DataInputStream dis) throws IOException{
Cookie cookie = new Cookie();
cookie.name = dis.readUTF();
cookie.value = dis.readUTF();
cookie.path = dis.readUTF();
cookie.expire = dis.readLong();
return cookie;
}
public long getExpire() {
return expire;
}
public void setExpire(long expire) {
this.expire = expire;
}
//for debug
public String toString(){
return name+"="+value+";expires="+new Date(expire).toString()+";path="+path;
}
public boolean isExpired(long now){
return expire-now<0;
}
public boolean isExpired(){
return expire-(new Date().getTime())<0;
}
public static Cookie parseCookie(String s,String uri){
Cookie cookie = new Cookie();
StringUtil su = new StringUtil(s,";");
while(su.hasMoreTokens()){
String str = su.nextToken().trim();
int i = str.indexOf("=");
if(i == -1){
//secure do nothing
continue;
}else{
String name = str.substring(0,i);
String value = str.substring(i+1,str.length());
if("path".equals(name)){
cookie.setPath(value);
}else if("expires".equals(name)){
cookie.setExpire(StringUtil.getData(value));
}else if("domain".equals(name)){
//do nothing
}else{
cookie.setName(name);
cookie.setValue(value);
}
}
if(cookie.getPath().equals(""))
cookie.setPath(uri);
}
return cookie;
}
public boolean equals(Object obj){
if(obj instanceof Cookie){
Cookie o = (Cookie)obj;
if(o.getName().equals(name) && o.getPath().equals(path))
return true;
}
return false;
}
public int hashCode(){
int result = 17;
result = result * 37 + path.hashCode();
result = result * 37 + name.hashCode();
return result;
}
}
供应了一个parseCookie办法来解析cookie,具体的原理就不再介绍了.然后需求把这个Cookie对象存储到RMS中.cookie并不大,所以不会占用太多的空间,在RMS中存储非常符合.注意关于会话期间的cookie没有必要存储在rms中,因为会话完毕后就失效了,不如在内存中声明一个Map来存储会话范例的cookie.
第三:发送cookie
发送cookie也是需求两个步骤,首先检索rms和内存看能否有满意条件的cookie,假若有读取出来.然后通过下面的办法向服务器端发送
//查抄能否有cookie需求发送给服务器端
String _cookie = collectCookie(url);
if(_cookie != null)
connection.setRequestProperty(COOKIE,_cookie);
假如可以顺利办理上面的三个步骤,基本可以实现cookie在java me平台的利用.在《Java ME核心技术与最佳实践》一书中,本人编写了一个httpme联网框架,此中包含了cookie在java me平台的实现,供大家参考.
以上是“cookie技术在Java ME平台的操纵与实现[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |