WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章J2ME技术J2ME基础Java中的cookie管理方案(3)-与J2ME结合

Java中的cookie管理方案(3)-与J2ME结合
作者:刘建华  来源:转载  发布时间:2005-11-29 12:54:28
jCookie结构
下面我将描述层及他们使用的不同的类。
层1
那些开发者多数都想进行透明cookie操作,这通常是使用层1的情形。在这个级别,你用Client类操作cookies。它有两个主要的方法:
· public CookieJar getCookies(URLConnection urlConn): 这个方法从给出的URLConnection中析取cookies,将它们解析到Cookie对象,并作为一个CookieJar返回。
· public CookieJar setCookies(URLConnection urlConn, CookieJar cj): 这个方法从CookieJar中提取合适的Cookie对象并设置URLConnection的报头。
层0
这些开发者没有在使用层0的代码中深入就无法呼吸(包括我)。在这里,你可以通过使用cookie操作代码改变解析逻辑和安全规则。要这样做,首先实现CookieParser接口,它有以下四个方法:
· public Header getCookieHeaders(CookieJar cj): 在CookieJar中转换Cookies为一报头以适合与一个HTTP请求一起发送。
· public boolean allowedCookie(Cookie c, URL url): 检查是否一个给出URL的请求能返回指定的Cookie。
· public CookieJar parseCookies(Header h, URL url): 在一个HTTP响应中将报头转换到一个Cookie对象的CookieJar中。
· public boolean sendCookieWithURL(Cookie c, URL url, boolean bRespectExpires): 检查是否给出的Cookie能被与给出URL的一个请求一起发送。
你能使用Client类的setCookieParser(CookieParser cp)方法去设置CookieParser实现。被库缺省使用的CookieParser是一个RFC 2965 cookie规范中的实现。
在层1,jCookie作为一个库;在层0,它成为一个API的基础。
jCookie用法
Client类在两个层都调用cookie操作逻辑。它提供了应用程序开发者的库架构。要使用jCookie库,按照下面这些步骤:
· 从响应到请求检索cookies:
创建一个URLConnection对象并初始化。
连接URLConnection。
创建一个Client对象并设定一个定制的CookieParser。
通过调用Client实例的getCookies()方法得到一个Cookies的CookieJar,作为在URLConnection中的一个参数。
与HTTP响应一起作一些事情。

· 和一个请求(假定一个CookieJar已被检索)一起发送cookies:
创建一个URLConnection对象并初始化。
创建一个Client对象并设定一个定制的CookieParser。
通过调用Client实例的setCookies()方法设置cookie报头,作为URLConnection and CookieJar 中的参数。
连接URLConnection。
与HTTP响应一起作一些事情。

下面的摘录显示了普通jCookie的用法。这个jCookie代码十分突出:



import com.sonalb.net.http.cookie.*;
import java.net.*;
import java.io.*;
...
public class Example
{
...
public void someMethod()
{
...
URL url = new URL("http://www.site.com/");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
//在这里初始化HttpURLConnection.
...
huc.connect();
InputStream is = huc.getInputStream();
Client client = new Client();
CookieJar cj = client.getCookies(huc);
//进行一些处理
...
huc.disconnect();
// 执行另一请求
url = new URL("http://www.site.com/");
huc = (HttpURLConnection) url.openConnection();
client.setCookies(huc, cj);
huc.connect();
...
// 进行一些处理
}
}


上面的代码描述了jCookie API的两个方面:
· 本地java.net对象的使用(HttpURLConnection)。
· 轻易地回收和发送cookies(单个方法调用)。
在实践中,上述代码已经能成功地维护两个请求间的会话。现在我们转换层的基本结构,让我们将jCookie与一些真实代码连接。
Hotmail新邮件检测器
为了阐明jCookie库的使用方便,我将在一个显示一个Hotmail账号新消息的发件人、主题及日期字段的应用程序中使用它。为了简单起见,应用程序在控制台显示这些信息。为了在Hotmail收件箱接收新消息,应用程序需要完成以下步骤:
· 在登录表单中执行一个HTTP POST操作登录Hotmail。
· 为了到达主页,操作重定向及cookies。
· 检索收件箱的HTML页。
· 提取新消息的相关字段。
多数站点要求用户第一次通过一个表单执行一个HTTP POST 操作以完成登录过程。为了成功鉴定身份,POST的响应通常是一个带一些cookie报头的HTTP重定向。当重定向页被请求时cookies返回给服务器。
jCookie库包括一个很有用的类叫HTTPRedirectHandler,它管理当完成客户端cookie操作时操作重定向的普通任务。要使用这个类,首先要在一个未连接的HttpURLConnection中创建一个HTTPRedirectHandler实例,然后调用HTTPRedirectHandler实例的connect()方法去操作重定向及cookie。句柄从HTTP响应代码中确定是否运行成功。一旦进程完成,调用的类就检索表明最后一次请求的HttpURLConnection对象。CookieJar包含所有在能被检索的重定向过程中接收的cookies。Cookie操作逻辑存在于HTTPRedirectHandler的connect()方法中。让我们来看一看这个方法的代码。Cookie操作部份进行了注释:



package com.sonalb.net.http;
import com.sonalb.net.http.cookie.*;
import java.net.*;
import java.io.*;
public class HTTPRedirectHandler
{
...
public HTTPRedirectHandler(HttpURLConnection huc)
{
...
}
public void connect() throws IOException
{
if(bConnected)
{
throw new IllegalStateException("No can do. Already connected.");
}
int code;
URL url;
huc.setFollowRedirects(false);
// 设置在Cookies中的检验
if(!cj.isEmpty())
{
client.setCookies(huc,cj);
}
is = huc.getInputStream();
// 从HttpURLConnection中提取Cookies并加到CookieJar中去
cj.addAll(Client.getCookies(huc));
while((code = huc.getResponseCode()) != successCode && maxRedirects > 0)
{
if(code != 302)
{
throw new IOException("Can't deal with this code (" + code + ").");
}
is.close();
is = null;
url = new URL(huc.getHeaderField("location"));
huc.disconnect();
huc = null;
huc = (HttpURLConnection) url.openConnection();
//和HTTP请求一起发送Cookies
Client.setCookies(huc, cj);
huc.setFollowRedirects(false);
huc.connect();
is = huc.getInputStream();
//从响应中提取Cookies并加进jar中去
cj.addAll(Client.getCookies(huc));
maxRedirects--;
}
if(maxRedirects <= 0 && code != successCode)
{
throw new IOException("Max redirects exhausted.");
}
bConnected = true;
}
//其他方法在这里出现
public void handleCookies(boolean b)
{
...
}
public void setSuccessCode(int i)
{
...
}
public void setCookieJar(CookieJar cj)
{
...
}
public void addCookies(CookieJar cj)
{
...
}
public CookieJar getCookieJar()
{
...
}
public HttpURLConnection getConnection()
{
...
}
public void setMaxRedirects(int i)
{
...
}
}


H

[1] [2]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码