Spec-Zone .ru
спецификации, руководства, описания, API
|
Выполняя апплет в браузере, используя среду выполнения Java Sun (JRE), если апплет обращается с просьбами HTTP к серверу, который перенаправляет запрос к HTTPS URL, сбои перенаправления. Перенаправление также перестало работать в случае обращения с просьбами HTTPS к серверу, который перенаправляет запрос к HTTP URL. Тот же самый апплет работает без любой ошибки в Microsoft Virtual Machine (VM).
Проблема вызывается HTTP или политикой перенаправления HTTPS, реализованной в Sun JRE. Из-за серьезных последствий безопасности, перенаправления между HTTP и HTTPS автоматически не сопровождается.
Когда апплет выполняется в браузере, используя Microsoft VM, безопасность, предупреждающая, что диалоговое окно запрашивает пользователя его согласие перенаправить. Перенаправление перестало работать, если пользователь не соглашается на него.
Приложение, которое выполняет апплет в браузере, должно проверить, что ответ кодирует и распознает это как перенаправление. Значение поля заголовка Расположения может быть проверено на информацию о перенаправлении, и затем приложение должно решить, следовать ли за перенаправлением, используя новый протокол. Например, если следующий код доступен в приложении:
public void makeConnection(URL url)
{
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
....
is.close();
}
вышеупомянутый код должен быть изменен на следующий код:
private InputStream openConnectionCheckRedirects(URLConnection c) throws IOException
{
boolean redir;
int redirects = 0;
InputStream in = null; do
{
if (c instanceof HttpURLConnection)
{
((HttpURLConnection) c).setInstanceFollowRedirects(false);
} // We want to open the input stream before getting headers
// because getHeaderField() et al swallow IOExceptions.
in = c.getInputStream();
redir = false;
if (c instanceof HttpURLConnection)
{
HttpURLConnection http = (HttpURLConnection) c;
int stat = http.getResponseCode();
if (stat >= 300 && stat <= 307 && stat != 306 &&
stat != HttpURLConnection.HTTP_NOT_MODIFIED)
{
URL base = http.getURL();
String loc = http.getHeaderField("Location");
URL target = null;
if (loc != null)
{
target = new URL(base, loc);
}
http.disconnect();
// Redirection should be allowed only for HTTP and HTTPS
// and should be limited to 5 redirections at most.
if (target == null || !(target.getProtocol().equals("http")
|| target.getProtocol().equals("https"))
|| redirects >= 5)
{
throw new SecurityException("illegal URL redirect");
}
redir = true;
c = target.openConnection();
redirects++;
}
}
}
while (redir);
return in;
}
public void makeConnection(URL url){
try{
URLConnection conn = url.openConnection();
InputStream is = openConnectionCheckRedirects(conn);
....
is.close();
}catch (IOException e){ } }
Ни один.