URL#openConnectionによるhttp通信時にBasic認証
Javaの標準機能を使ってhttp通信するときは、URLクラスのopenConnectionメソッドを使って接続するわけだけど、そのときにBasic認証で認証したいときのやりかた。
final String username = "username"; final String password = "p@ssw0rd"; Authenticator.setDefault(new Authenticator(){ @Override protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication(username, password.toCharArray()); } });
- AuthenticatorクラスのsetDefaultメソッドを呼ぶ。これはstaticメソッド。
- 引数として、Authenticatorインタフェースを実装したクラスのインスタンスを渡す。
- いちいちクラスを定義してインスタンスをnewして渡すと面倒なので、匿名クラス(無名インナークラス)で渡すのが簡単。
- 匿名クラス内のコードから、外の変数を参照する場合、外の変数はfinalにしておくか、インスタンス変数にしておく必要がある。
これを、openConnectionメソッドを呼ぶ前にやっておく。
これでうまくいったから良いけど、なんでこんな仕様なの?あらかじめstaticメソッドを呼んでおくなんて、微妙すぎると思うんだけど。