How to handle multiple Authenticator

前端 未结 3 1637
悲哀的现实
悲哀的现实 2021-01-06 09:54

To authenticate a request, I use Authenticator.setDefault which is VM wide...
What If I want to separate different webservices and each one are aware of t

3条回答
  •  花落未央
    2021-01-06 10:15

    Here's the solution I've implemented and it works like a charm!

    import java.net.*;
    import java.util.*;
    import java.util.logging.*;
    import java.util.regex.*;
    
    /**
     * Authenticator which keeps credentials to be passed to the requester
     * based on the concatenation of the authority and the URL that requires
     * authentication.
     * 
     * If the configured credentials are not found, the Authenticator will
     * use the embedded credentials if present.
     * 
     * Embedded credentials are in the form of 
    user:password@host:port/<url-path>
    * * @author Michael Fortin 2011-09-23 */ public class Authenticator extends java.net.Authenticator { private Logger log = Logger.getLogger(this.getClass().getName()); private Map authInfos; private Pattern embeddedAuthInfoPattern; @Override protected PasswordAuthentication getPasswordAuthentication() { String requesterInfo = String.format("%s%s", getRequestingURL().getAuthority(), getRequestingURL().getPath()); log.fine(String.format("%s at \"%s\" is requesting %s password authentication for \"%s\"", getRequestorType(), getRequestingPrompt(), getRequestingScheme(), requesterInfo)); PasswordAuthentication pa = null; if ((pa = authInfos.get(requesterInfo)) == null && (pa = getEmbeddedPA(getRequestingURL().getAuthority())) == null) { log.warning(String.format("No authentication information for \"%s\"", requesterInfo)); } return pa; } public void setAuthInfos(Map authInfos) { this.authInfos = authInfos; } public void setEmbeddedAuthInfoPattern(String pattern) { this.embeddedAuthInfoPattern = Pattern.compile(pattern); } private PasswordAuthentication getEmbeddedPA(String authInfo) { if (authInfo != null) { Matcher matcher = embeddedAuthInfoPattern.matcher(authInfo); if (matcher.find()) { return new PasswordAuthentication(matcher.group(1), matcher.group(2).toCharArray()); } } return null; } }

提交回复
热议问题