用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

CookieHandler 使用Demo

2013-04-09 作者: 神马举报

[java]代码库

import java.io.IOException;
import java.net.CookieHandler;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;

public class Fetch5 {
    public static void main (String args[]) throws Exception {
        String urlString = "java.sun.com";
        CookieHandler.setDefault (new ListCookieHandler() );
        URL url = new URL (urlString);
        URLConnection connection = url.openConnection();
        Object obj = connection.getContent();
        url = new URL (urlString);
        connection = url.openConnection();
        obj = connection.getContent();
    }
}

class ListCookieHandler extends CookieHandler {
    private List<Cookie> cookieJar = new LinkedList<Cookie>();

    public void put (URI uri, Map<String, List<String>> responseHeaders) throws IOException {
        List<String> setCookieList = responseHeaders.get ("Set-Cookie");
        if (setCookieList != null) {
for (String item : setCookieList) {
                Cookie cookie = new Cookie (uri, item);
for (Cookie existingCookie : cookieJar) {
                    if ( (cookie.getURI().equals (existingCookie.getURI() ) )
                    && (cookie.getName().equals (existingCookie.getName() ) ) ) {
                        cookieJar.remove (existingCookie);
                        break;
                    }
                }
                cookieJar.add (cookie);
            }
        }
    }

    public Map<String, List<String>> get (URI uri, Map<String, List<String>> requestHeaders)
    throws IOException {
        StringBuilder cookies = new StringBuilder();
for (Cookie cookie : cookieJar) {
            // Remove cookies that have expired
            if (cookie.hasExpired() ) {
                cookieJar.remove (cookie);
            } else if (cookie.matches (uri) ) {
                if (cookies.length() > 0) {
                    cookies.append (", ");
                }
                cookies.append (cookie.toString() );
            }
        }

        Map<String, List<String>> cookieMap = new HashMap<String, List<String>> (requestHeaders);

        if (cookies.length() > 0) {
            List<String> list = Collections.singletonList (cookies.toString() );
            cookieMap.put ("Cookie", list);
        }
        System.out.println ("CookieMap: " + cookieMap);
        return Collections.unmodifiableMap (cookieMap);
    }
}

class Cookie {

    String name;

    String value;

    URI uri;

    String domain;

    Date expires;

    String path;

    private static DateFormat expiresFormat1 = new SimpleDateFormat ("E, dd MMM yyyy k:m:s 'GMT'",
            Locale.US);

    private static DateFormat expiresFormat2 = new SimpleDateFormat ("E, dd-MMM-yyyy k:m:s 'GMT'",
            Locale.US);

    public Cookie (URI uri, String header) {
        String attributes[] = header.split (";");
        String nameValue = attributes[0].trim();
        this.uri = uri;
        this.name = nameValue.substring (0, nameValue.indexOf ('=') );
        this.value = nameValue.substring (nameValue.indexOf ('=') + 1);
        this.path = "/";
        this.domain = uri.getHost();

        for (int i = 1; i < attributes.length; i++) {
            nameValue = attributes[i].trim();
            int equals = nameValue.indexOf ('=');
            if (equals == -1) {
                continue;
            }
            String name = nameValue.substring (0, equals);
            String value = nameValue.substring (equals + 1);
            if (name.equalsIgnoreCase ("domain") ) {
                String uriDomain = uri.getHost();
                if (uriDomain.equals (value) ) {
                    this.domain = value;
                } else {
                    if (!value.startsWith (".") ) {
                        value = "." + value;
                    }
                    uriDomain = uriDomain.substring (uriDomain.indexOf ('.') );
                    if (!uriDomain.equals (value) ) {
                        throw new IllegalArgumentException ("Trying to set foreign cookie");
                    }
                    this.domain = value;
                }
            } else if (name.equalsIgnoreCase ("path") ) {
                this.path = value;
            } else if (name.equalsIgnoreCase ("expires") ) {
                try {
                    this.expires = expiresFormat1.parse (value);
                } catch (ParseException e) {
                    try {
                        this.expires = expiresFormat2.parse (value);
                    } catch (ParseException e2) {
                        throw new IllegalArgumentException ("Bad date format in header: " + value);
                    }
                }
            }
        }
    }

    public boolean hasExpired() {
        if (expires == null) {
            return false;
        }
        Date now = new Date();
        return now.after (expires);
    }

    public String getName() {
        return name;
    }

    public URI getURI() {
        return uri;
    }

    public boolean matches (URI uri) {

        if (hasExpired() ) {
            return false;
        }
        String path = uri.getPath();
        if (path == null) {
            path = "/";
        }

        return path.startsWith (this.path);
    }

    public String toString() {
        StringBuilder result = new StringBuilder (name);
        result.append ("=");
        result.append (value);
        return result.toString();
    }
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...