文章目录
- 1. 简介
- 2. CookieStore
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)
将一个 HTTP cookie 添加到存储区。每个传入的 HTTP 响应都会调用此函数。要存储的 Cookie 可能与 URI 相关联,也可能不关联。如果它不与 URI 关联,则 Cookie 的域和路径属性将指示它的来源。如果它与 URI 相关联,并且未指定其域和路径属性,则给定 URI 将指示此 cookie 的来源。如果与给定 URI 对应的 cookie 已经存在,则将其替换为新的 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);
}
}
}