使用java.net.Authenticator注销

时间:2010-01-26 10:09:46

标签: java http authentication

我想知道你们中是否有人知道如何使用java.net.Authenticator类'注销'基本身份验证(BA)。我知道BA没有注销方法,你必须关闭并重新打开浏览器才能结束会话。问题是,你如何在java代码中关闭并重新打开浏览器?也就是说,我通过java而不是borwser进行连接,那么如何让JVM自行“去验证”呢?

上下文:我正在编写一个应用程序,使用BA向多个Twitter帐户发布推文。我可以使用java.net。*发布一个帐户的推文(并且可以看到它调用我的身份验证器类)但是当我尝试发布第二个推文时,我看不到对身份验证器的任何第二次调用,推文被发射到第一个帐户。

是否可以让Authenticator重新进行身份验证,或者这是一个死胡同?如果是这样,我可能最终会使用OAuth。

非常感谢您提供的任何见解!

沙恩

    static class MyAuthenticator extends Authenticator {

    private String username, password;

    public MyAuthenticator(String user, String pass) {
        username = user;
        password = pass;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        System.out.println("Requesting Host  : " + getRequestingHost());
        System.out.println("Requesting Scheme : " + getRequestingScheme());
        System.out.println("Requesting Site  : " + getRequestingSite());
        return new PasswordAuthentication(username, password.toCharArray());
    }
}

public void tweet(AutoTwitterAccount acc,String tweet){ Authenticator.setDefault(NULL);

    Authenticator.setDefault(new MyAuthenticator(acc.getUserName(), acc.getPassword()));
    try {
        /* First login the session and fire off tweet*/
        URL url = new URL(AutoTweeter.TWEET_URL);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("User-Agent", "Mozilla/4.0");
        conn.setRequestProperty("User-Agent", AGENT);
        conn.setRequestProperty("Content-Type", TYPE);
        conn.setRequestProperty("Content-Length", "" + tweet.length());
                ...fire off tweet....
        conn.disconnect();

再次感谢!

3 个答案:

答案 0 :(得分:4)

如果Authenticator确实没有再次被调用(甚至将其重置为另一个也不起作用,这显然是由于a bug),那么你可以放弃Authenticator和send the HTTP Basic Auth header manually

URL url = new URL("http://www.example.com/comment");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Authorization:",
"Basic "+codec.encodeBase64String(("username:password").getBytes());

答案 1 :(得分:0)

我试过了,但它仍然无法进行身份验证,但我已经通过使用同事实用程序类来自己构建HTTP请求并直接将其写入套接字,绕过Sun的Http类。但无论如何,谢谢你的回答!

答案 2 :(得分:0)

如果您使用Authenticator作为代理,请尝试以下操作:

import org.apache.commons.codec.binary.Base64;
...
StringBuilder auth = new StringBuilder("Basic ");
auth.append(Base64.encodeBase64String((username + ':' + password).getBytes()));
connection.setRequestProperty("Proxy-Authorization", auth.toString());