Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Перенаправление Между HTTP URL и HTTPS URL Не Сопровождается

Признаки

Выполняя апплет в браузере, используя среду выполнения 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){ } }

Соответствующая информация

Ни один.

 


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами