我想知道你们中是否有人知道如何使用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();
再次感谢!
答案 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());