用户: 密码: 答案:   我要注册   忘记密码

加入收藏  设为首页

开发文档

CNJM首页

业界新闻

手机软件

终端应用

资源下载

EclipseME

CNJM论坛

                 

频道列表

J2ME开发 176篇
服务器端开发 33篇
JAVA语言 71篇
游戏与图形 101篇
WindowsMobile开发 6篇
Symbian开发 61篇
Brew开发 36篇
其它开发平台 6篇

热点文章

四种JAD生成器之比... 53943次
手机JAVA入门讲座 32751次
手机游戏毕业设计论文 29569次
各厂商SDK和模拟器... 20319次
Java手机机型对应表 19249次
一个关于CMNET和CM... 18455次
2005年毕业论文---... 16713次
手机JAVA MIDP2.0讲座 16405次
JAVA手机性能参数大全 14540次
手机JAVA中级讲座 12652次
J2ME程序开发新手...  11377次
我的第一个Java手...  11186次

文章搜索

搜 索
按 照
频 道
  
cookie技术在Java ME平台的应用与实现
编辑:rocks    审核:rocks    文章来源:J2MEDEV
关键词:无    发表日期:2007-05-16 22:04:18    浏览次数:3042次
本文版权归原作者,中国JAVA手机网收录本文的目的是让更多人阅读到此文章。转载请注明出处为中国JAVA手机网<www.cnjm.net>
来自:http://www.cnjm.net/tech/article4060.html

[转载于J2MEDEV]

作者:mingjava

Cookie在Web应用程序中被广泛采用,维护浏览器和服务器之间的状态。遗憾的是这一特性在Java ME平台中并没有得到支持。因此,要想维持客户端和服务器端的状态则必须使用URL重写的方式。URL重写操作起来比较麻烦,所以研究一下cookie的原理并在Java ME平台上实现cookie是不错的尝试。

首先,我们来看一下cookie的原理。当服务器需要和浏览器维持某一状态的时候,例如需要记录用户的购物车中已经购买的商品。这时候服务器可以新建一个Cookie并把它写入到响应中,浏览器从响应中接收到cookie并保存起来。当浏览器再次向服务器发送请求的时候,浏览器会根据域(domain)和路径(path)检查是否有匹配的cookie,如果有则把cookie以“名称=值”的形式发送给服务器,服务器从请求中解析出cookie就知道用户的状态了。那么,浏览器根据什么规则来决定向服务器发送cookie呢,首先要匹配domain,如果cookie的域属性是.google.com,那么请求指向j2medev.com的时候,cookie就不会被发送。如果域匹配的条件满足,则判断path是否匹配,如果cookie的path属性是请求的uri的父目录的话,那么cookie就会被发送给服务器。Cookie是有存活周期的,到期的cookie会被浏览器自动清除。如果服务器创建cookie的时候不设置生命周期,那么在会话结束后浏览器就会删除cookie。如果不为cookie指定path属性,那么默认就是这次请求的路径。

JAVA手机网[www.cnjm.net]
cookie在很多web应用程序中都有应用,比如记住密码,购物车等。在开发MIDlet的时候,你也可以让你的应用程序支持cookie,这样维持客户端与服务器端的状态将变得简单,为你集中精力解决其他业务方法奠定了基础。既然已经知道了cookie的工作原理,那么就应该考虑一下在Java ME平台如何实现cookie,这个想法是否可行。我将从下面三个方面进行分析。

第一:获得cookie

JAVA手机网[www.cnjm.net]
当服务器端的响应到来的时候,我们应该能够读取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.

JAVA手机网[www.cnjm.net]
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() {
JAVA手机网[www.cnjm.net]
       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);
JAVA手机网[www.cnjm.net]
       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) {
JAVA手机网[www.cnjm.net]
       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;
   }
JAVA手机网[www.cnjm.net]
   
   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();
JAVA手机网[www.cnjm.net]
           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;
JAVA手机网[www.cnjm.net]
   }
   
JAVA手机网[www.cnjm.net]
   public boolean equals(Object obj){
       if(obj instanceof Cookie){
           Cookie o = (Cookie)obj;
           if(o.getName().equals(name) && o.getPath().equals(path))
JAVA手机网[www.cnjm.net]
               return true;
       }
       return false;
   }
   
JAVA手机网[www.cnjm.net]
   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,如果有读取出来。然后通过下面的方法向服务器端发送

JAVA手机网[www.cnjm.net]
           //检查是否有cookie需要发送给服务器端
           String _cookie = collectCookie(url);
           if(_cookie != null)
               connection.setRequestProperty(COOKIE,_cookie);

JAVA手机网[www.cnjm.net]
如果能够顺利解决上面的三个步骤,基本可以实现cookie在java me平台的应用。在《Java ME核心技术与最佳实践》一书中,本人编写了一个httpme联网框架,其中包括了cookie在java me平台的实现,供大家参考。
来自:http://www.cnjm.net/tech/article4060.html

相关文章
   暂无相关文章
最新评论
网站简介  |  关于版权  |  广告服务  |  网站地图  |  联系我们
Copyright © www.CNJM.net, All rights reserved
中国JAVA手机网 版权所有
ICP备案:京ICP备041452