同じ https URL を連続して何回も呼び出すのに問題があります。最初の要求は成功しますが、不確定な時間が経過すると、401 HTTP エラー コード例外がスローされ、ユーザー資格情報が無効であることを示します。
この問題についてデータベース/サーバーの担当者と話し合ったところ、一定の時間が経過するとサーバーがセッション データを無効にし、同じ URL への呼び出しが同じ URL で繰り返されるため、私が経験している問題は正常であるとのことでした。 401 HTTP エラー コードが返されます。
彼は、必要なすべての呼び出しを別の URLConnection オブジェクトに処理させれば、期限切れのセッション データについて心配する必要がなくなるはずだと指摘しました。
彼の説明は理にかなっているように見えますが、以下のコード スニペットが示すように、同じユーザー資格情報を持つ同じ URL への各要求に対して、まったく新しい URLConnection オブジェクトを既に使用しています。したがって、私が言われたことが正しければ、問題は URLConnection オブジェクトがすべて同じ基になる接続を使用していて、そのために同じセッション データを共有していることだと思います。
私が正しい方向に進んでいると仮定すると、同じユーザー資格情報を使用して同じ URL に新しいリクエストを行うたびに、期限切れのセッション データが原因で問題が発生しないように、コードをどのように変更すればよいでしょうか? 基になる HttpsURLConnection オブジェクトで disconnect() を呼び出すだけの問題ですか?
public static void main(String[] args)
{
String url = "https://...";//some https url
int x = 0;
while(true)
{
try
{
System.out.print("call#: " + (++x));
//call download() with a valid username & password
String result = download(url, "some-valid-username", "some-valid-password");
System.out.println(result);
}
catch(Throwable e)
{
//after hundreds of successful calls,
//a 401 HTTP error code exception
e.printStackTrace();
break;
}
}
}
public static String download(String url, String user, String pass) throws IOException
{
//new URLConnection object
java.net.URLConnection connection = new java.net.URL(url).openConnection();
connection.setRequestProperty("Authorization",
"Basic " +
javax.xml.bind.DatatypeConverter.printBase64Binary(
(user + ":" + pass).getBytes("UTF-8")));
//get response
InputStream is = null;
byte[] response = null;
try
{
is = connection.getInputStream();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
byte[] bytes = new byte[16384];
int x = 0;
while((x = is.read(bytes, 0, bytes.length)) != -1){
stream.write(bytes, 0, x);
}
stream.flush();
response = stream.toByteArray();
}
finally
{
if (is != null)
{
is.close();
}
}
//((javax.net.ssl.HttpsURLConnection)connection).disconnect();// ?
return response != null ? new String(response, "UTF-8") : null;
}