当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • PHP CURL 发送COOKIE
  • cookie技术在Java ME平台的操纵与实现
  • Servlet的Cookie值保存与得到
  • 深化理解Cookie
  • <b>session与cookie的辨别</b>
  • Servlet写入Cookie转发后无法读取的问题
  • Java操作Cookie详解
  • 实现Cookie
  • <b>上网隐私的安全保障 Cookie设置三部曲</b>
  • js 设置cookie与 获得cookie函数
  • js 读写cookie实现代码
  • jsp或servlet中删除Cookie
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .