文章目录
1. 简介
Java5包括一个抽象类Java.net.CookieHandler,它定义了存储和获取Cookie的一个API,但不包括这个抽象类的实现,所以还有很多工作要做。Java6进一步作了补充,为CookieManager增加了一个可以使用的具体子类java.net.CookieManager。不过默认情况下Cookie并不打开。在Java存储和返回Cookie之前,需要先启动cookie
CookieManager manager=new CookieManager();
CookieManager.setDefault(manager)
用这两行代码安装一个CookieManager之后,对于你用URL类连接的HTTP服务器,Java会存储这些服务器发送的所有Cookie,在后续的请求中向这些服务器发回所存储的cookie,不过,对于接受哪里发送的Cookie,可以通过指定一个CookiePolicy来做到
CookiePolicy.ACCEPT_ALL
接受所有的cookieCookiePolicy.ACCEPT_NONE
不接受任何cookieCookiePolicy.ACCEPT_ORIFINAL_SERVER
值接受一方的cookie
下面这段代码只接受一方的cookie,而会阻塞第三方的cookie(即只接受与你对话的服务器发送的cookie,而不接受Internet上其它服务器发送的cookie):
CookieManager manager=new CookieManager();
manager.setCoolkiePolicy(CookiePolicy.AACCEPT_ORIFINAL_SERVER);
CookieHandler.setDefault(manager)
下面这段代码我们自行实现了CookiePolicy接口,并覆盖了shouldAccept()方法:
public class NoGovermentCoolies implements CookiePolicy{
@Override
public boolean shouldAccept(URI uri,HttpCookie cookie){
if(uri.getAuthority().toLowerCase().endWith(".gov") || cookie.getDomain().toLowerCase().endWith(".gov")){
return false;
}
return true;
}
}
2. CookieStore
有时有必要在本地存放和获取Cookie。一个应用退出时,可以把cookie库保存在磁盘上,下一次启动时再加载这些cookie。可以用getCookieStore()
方法获取这个cookie库,CookieManager就在这里保存它的cookie
CookieStore store=manager.getCookieStore()
CookieStore类允许你增加,删除和列出cookie,使你能控制在正常HTTP请求和响应流之外发送的cookie
public void add(URI uri, HttpCookie cookie)
public List<HttpCookie> get(URI uri)
public List<HttpCookie> getCookies()
public List<URI> getURIs()
public boolean remove(URI uri,HttpCookie cookie)
public boolean removeAll()
public void add(URI uri, HttpCookie cookie)
public class QuizCardBuilder {
public static void main(String[] args) {
try {
URL u=new URL("http://www.baidu.com");
//创建socket连接指定的网站
URLConnection uc=u.openConnection();
//创建一个CookieManager对象
CookieManager cookieManager=new CookieManager();
//设置接受cookie的范围(只接受百度服务器发送过来的)
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);
CookieHandler.setDefault(cookieManager);
CookieStore store=cookieManager.getCookieStore();
URI uri=u.toURI();
//新建一个cookie
HttpCookie cookie=new HttpCookie("skin","noskin");
store.add(uri,cookie);
System.out.println(store.get(uri));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
public List<HttpCookie> get(URI uri)
public class QuizCardBuilder {
public static void main(String[] args) {
try {
URL u=new URL("http://www.baidu.com");
//创建socket连接指定的网站
URLConnection uc=u.openConnection();
//创建一个CookieManager对象
CookieManager cookieManager=new CookieManager();
//设置接受cookie的范围(只接受百度服务器发送过来的)
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);
CookieHandler.setDefault(cookieManager);
CookieStore store=cookieManager.getCookieStore();
URI uri=u.toURI();
//新建一个cookie
HttpCookie cookie=new HttpCookie("skin","noskin");
store.add(uri,cookie);
System.out.println(store.get(uri).toString());
} catch (MalformedURLException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
}
public boolean remove(URI uri,HttpCookie cookie)
public class QuizCardBuilder {
public static void main(String[] args) {
try {
URL u=new URL("http://www.baidu.com");
//创建socket连接指定的网站
URLConnection uc=u.openConnection();
//创建一个CookieManager对象
CookieManager cookieManager=new CookieManager();
//设置接受cookie的范围(只接受百度服务器发送过来的)
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);
CookieHandler.setDefault(cookieManager);
CookieStore store=cookieManager.getCookieStore();
URI uri=u.toURI();
//新建一个cookie
HttpCookie cookie=new HttpCookie("skin","noskin");
store.add(uri,cookie);
System.out.println(store.get(uri).toString());
System.out.println(store.remove(uri,cookie));
} catch (MalformedURLException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
}