authenticationinfo.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 507 行 · 第 1/2 页

JAVA
507
字号
/* * @(#)AuthenticationInfo.java	1.30 06/10/10 * * Copyright  1990-2008 Sun Microsystems, Inc. All Rights Reserved.   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER   *    * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License version   * 2 only, as published by the Free Software Foundation.    *    * This program is distributed in the hope that it will be useful, but   * WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   * General Public License version 2 for more details (a copy is   * included at /legal/license.txt).    *    * You should have received a copy of the GNU General Public License   * version 2 along with this work; if not, write to the Free Software   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA   * 02110-1301 USA    *    * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa   * Clara, CA 95054 or visit www.sun.com if you need additional   * information or have any questions.  * */package sun.net.www.protocol.http;import java.io.IOException;import java.net.URL;import java.util.Hashtable;import java.util.LinkedList;import java.util.ListIterator;import java.util.Enumeration;import java.util.HashMap;import sun.net.www.HeaderParser;/** * AuthenticationInfo: Encapsulate the information needed to * authenticate a user to a server. * * @version 1.19, 11/06/00  *///	It would be nice if this class understood about partial matching.//	If you're authorized for foo.com, chances are high you're also//	authorized for baz.foo.com.// NB:  When this gets implemented, be careful about the uncaching//	policy in HttpURLConnection.  A failure on baz.foo.com shouldn't//	uncache foo.com!abstractclass AuthenticationInfo implements Cloneable {    // Constants saying what kind of authroization this is.  This determines    // the namespace in the hash table lookup.    static final char SERVER_AUTHENTICATION = 's';    static final char PROXY_AUTHENTICATION = 'p';    /**     * Caches authentication info entered by user.  See cacheKey()     */    static private PathMap cache = new PathMap();    /**      * If true, then simultaneous authentication requests to the same realm/proxy     * are serialized, in order to avoid a user having to type the same username/passwords     * repeatedly, via the Authenticator. Default is false, which means that this     * behavior is switched off.     */    static boolean serializeAuth;    static {	serializeAuth = ((Boolean)java.security.AccessController.doPrivileged(		new sun.security.action.GetBooleanAction(		    "http.auth.serializeRequests"))).booleanValue();    }    /**     * requests is used to ensure that interaction with the     * Authenticator for a particular realm is single threaded.     * ie. if multiple threads need to get credentials from the user     * at the same time, then all but the first will block until     * the first completes its authentication.     */    static private HashMap requests = new HashMap ();    /* check if a request for this destination is in progress     * return false immediately if not. Otherwise block until     * request is finished and return true     */    static private boolean requestIsInProgress (String key) {	if (!serializeAuth) {	    /* behavior is disabled. Revert to concurrent requests */	    return false;	}	synchronized (requests) {	    Thread t, c;	    c = Thread.currentThread();            if ((t=(Thread)requests.get(key))==null) {	    	requests.put (key, c);		return false;            }	    if (t == c) {		return false;	    }            while (requests.containsKey(key)) {		try {                    requests.wait ();		} catch (InterruptedException e) {}            }	}        /* entry may be in cache now. */	return true;    }    /* signal completion of an authentication (whether it succeeded or not)      * so that other threads can continue.      */    static private void requestCompleted (String key) {	synchronized (requests) {	    boolean waspresent = requests.remove (key) != null;	    // Uncomment this line if assertions are always	    //    turned on for libraries	    //assert waspresent;	    requests.notifyAll();	}    }    static void printCache () {cache.print(); }    //public String toString () {	//return ("{"+type+":"+authType+":"+protocol+":"+host+":"+port+":"+realm+":"+path+"}");    //}    // TODO:  This cache just grows forever.  We should put in a bounded    //	      cache, or maybe something using WeakRef's.    /** The type (server/proxy) of authentication this is.  Used for key lookup */    char type;    /** The authentication type (basic/digest). Also used for key lookup */    char authType;    /** The protocol/scheme (i.e. http or https ). Need to keep the caches     *  logically separate for the two protocols. This field is only used     *  when constructed with a URL (the normal case for server authentication)     *  For proxy authentication the protocol is not relevant.     */    String protocol;    /** The host we're authenticating against. */    String host;    /** The port on the host we're authenticating against. */    int port;    /** The realm we're authenticating against. */    String realm;    /** The shortest path from the URL we authenticated against. */    String path;    /** Use this constructor only for proxy entries */    AuthenticationInfo(char type, char authType, String host, int port, String realm) {	this.type = type;    	this.authType = authType;	this.protocol = "";	this.host = host.toLowerCase();	this.port = port;	this.realm = realm;	this.path = null;    }    public Object clone() {	try {	    return super.clone ();	} catch (CloneNotSupportedException e) {	    // Cannot happen because Cloneable implemented by AuthenticationInfo	    return null;	}    }    /*     * Constructor used to limit the authorization to the path within     * the URL. Use this constructor for origin server entries.     */    AuthenticationInfo(char type, char authType, URL url, String realm) {    	this.type = type;    	this.authType = authType;	this.protocol = url.getProtocol().toLowerCase();	this.host = url.getHost().toLowerCase();	this.port = url.getPort();	if (this.port == -1) {	    this.port = url.getDefaultPort();	}	this.realm = realm;	String urlPath = url.getPath();	if (urlPath.length() == 0)	    this.path = urlPath;	else {	    this.path = reducePath (urlPath);	}    }    /*     * reduce the path to the root of where we think the     * authorization begins. This could get shorter as     * the url is traversed up following a successful challenge.     */    static String reducePath (String urlPath) {        int sepIndex = urlPath.lastIndexOf('/');        int targetSuffixIndex = urlPath.lastIndexOf('.');        if (sepIndex != -1)	    if (sepIndex < targetSuffixIndex)	        return urlPath.substring(0, sepIndex+1);	    else	        return urlPath;        else	    return urlPath;    }    /**     * Returns info for the URL, for an HTTP server auth.  Used when we      * don't yet know the realm     * (i.e. when we're preemptively setting the auth).     */    static AuthenticationInfo getServerAuth(URL url) {	int port = url.getPort();	if (port == -1) {	    port = url.getDefaultPort();	}	String key = SERVER_AUTHENTICATION + ":" + url.getProtocol().toLowerCase()		+ ":" + url.getHost().toLowerCase() + ":" + port;	return getAuth(key, url);    }    /**     * Returns info for the URL, for an HTTP server auth.  Used when we      * do know the realm (i.e. when we're responding to a challenge).     * In this case we do not use the path because the protection space     * is identified by the host:port:realm only     */    static AuthenticationInfo getServerAuth(URL url, String realm, char atype) {	int port = url.getPort();	if (port == -1) {	    port = url.getDefaultPort();	}	String key = SERVER_AUTHENTICATION + ":" + atype + ":" + url.getProtocol().toLowerCase()		     + ":" + url.getHost().toLowerCase() + ":" + port + ":" + realm;	AuthenticationInfo cached = getAuth(key, null);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?