Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как " обойти" sessionid? 
:(
    Опции темы
Sliva
Дата 13.7.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Начанаю изучать java, помогите пожалуйста! Надо скачать данные с сайта по протоколу http, но  ничего не получается, потому что там определяется session id, как можно обойти эту защиту? Help!!
PM   Вверх
ekr
Дата 13.7.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: нет
Всего: 19



В общем случае при обращении к странице, на которой создается сессия (храниться на сервере), на клиент передается идентификатор сессии - тот самый sessionid. Этот идентификатор может сохранятся браузером как куки или прикрепляться к нужным ссылкам на странице (этот подход называется url-rewriting). После этого клиент продолжает работать с веб-приложением и сервер четко его отличает от остальных клиентов.

Мораль: зачем "обходить" sessionid? Надо просто зайти на титульную страницу, где сервер свяжет с клиентом сессию и спокойно работать дальше )


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
COVD
Дата 13.7.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

Надо просто зайти на титульную страницу, где сервер свяжет с клиентом сессию и спокойно работать дальше )


где "сервер свяжет с клиентом сессию" скорее всего означает ввод имени и пароля 

Это сообщение отредактировал(а) COVD - 13.7.2007, 15:44
PM MAIL   Вверх
ekr
Дата 13.7.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: нет
Всего: 19



Цитата(COVD @  13.7.2007,  15:42 Найти цитируемый пост)
мне почему-то кажется, что между "зайти" и "спокойно работать дальше" требуется ввод имени и пароля  

абсолютно верно )))

соответственно, концепция меняется: Надо просто зайти на титульную страницу, спокойно передать ей логин и пароль и с не меньшим достоинством работать дальше )))

Улыбаемся и машем ))) (С) Пингвины


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
Sliva
Дата 14.7.2007, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Спасибо за помощь! 
Ввода логина и пароля не требуется. 
Но я не могу понять как мне "имитировать" путь до нужной мне страницы: 
Допустим www.aaa.ru - главная
надо пройти www.aaa.ru/bbb/ 
а нужная мне - www.aaa.ru/bbb/ccc
Т.е. я хочу пройти на www.aaa.ru/bbb/ccc  без ввода пароля/логина (это не нужно) программно, с помощью классов URL и URLConnection.
я пишу  так: 
Код

 URL hp = new URL ("http://www.aaa.ru");
     URLConnection hpCon = hp.openConnection();
    
а как потом дойти аналогично до www.aaa.ru/bbb/ccc
 - не знаю 
PM   Вверх
LSD
Дата 14.7.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(Sliva @  14.7.2007,  10:15 Найти цитируемый пост)
а как потом дойти аналогично до www.aaa.ru/bbb/ccc - не знаю 

Код
URL hp = new URL ("http://www.aaa.ru/bbb/ccc");
URLConnection hpCon = hp.openConnection();

smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Sliva
Дата 15.7.2007, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Т.е. прописать все три ссылки с одним соединением? Вот так: 
Код

URL hp = new URL  ("www.aaa.ru/bbb/ ");
URL hp1 = new URL  ("www.aaa.ru/bbb/ ");
URL hp2 = new URL  ("www.aaa.ru/bbb/ccc ");
URLConnection hpCon2 = hp2.openConnection();

И соединение должно быть к той странице, которая мне нужна? 
PM   Вверх
LSD
Дата 15.7.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



У тебя 3 разных файла запрашиваются, соответсвенно должо быть 3 коннекта.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
COVD
Дата 15.7.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

Но я не могу понять как мне "имитировать" путь до нужной мне страницы: 


Вам наверное надо "имитировать" работу браузера с куками. Если сервер заводит сессию, то он отправляет sessionID в виде куки. Браузер запоминает куки и автоматически добавляет в последующие запросы. Раз вы это делаете программно, то и должы сами этот механизм реализовать. Из ответа на первый запрос извлечь куки (sessionID) - getCookie() , запомнить его и в последующих запросах вставлять в Header посредством setCookie(..). Тогда сервер вас будет "узнавать". 
PM MAIL   Вверх
Sliva
Дата 16.7.2007, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Цитата

У тебя 3 разных файла запрашиваются, соответсвенно должо быть 3 коннекта. 

В том-то и дело, что мне сказали - это не подходит для данного случая, потому что все данные теряются. 
Цитата

Вам наверное надо "имитировать" работу браузера с куками. Если сервер заводит сессию, то он отправляет sessionID в виде куки. Браузер запоминает куки и автоматически добавляет в последующие запросы. Раз вы это делаете программно, то и должы сами этот механизм реализовать. Из ответа на первый запрос извлечь куки (sessionID) - getCookie() , запомнить его и в последующих запросах вставлять в Header посредством setCookie(..). Тогда сервер вас будет "узнавать".
  
А можно простенький примерчик?  smile 

PM   Вверх
COVD
Дата 16.7.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

простенький примерчик
 означает простенький http клиент. Поскольку существует сложненький апачевский HttpClient  http://jakarta.apache.org/commons/httpclient/ , то может и не стоит изобретать велосипед. Но с другой стороны, иногда проще написать несколько строк без претензий, чем разбираться с монстром.

Вот эти несколько строк без претензий на совершенство:

Сначала как создать соединение. Это можно оформить в виде статического метода

Код


      /*
       request - это строка "http://www.....com/....."
       cookie - это то, что нам сервер прислал в ответ на предыдущий запрос.
      */

private static HttpURLConnection newConnection(String request, String cookie){
    try {


      URL url = new URL(request);
      HttpURLConnection connection = (HttpURLConnection)url.openConnection();
      /*
     Здесь мы запрещаем соединению автоматически отрабатывать redirect (код 302) 
     иначе мы не сможем вытащить из ответа cookie. Но поскольку мы запретили автоматическое
     перенаправление, то должны сами его реализовать при необходимости. 
      */
      connection.setInstanceFollowRedirects(false);

      connection.setUseCaches(false);
      connection.setRequestMethod("GET");

      /*
      Если в предыдущем запросе сервер нам прислал куки (sessionID), то в последующих запросах мы
      должны его поместить в запрос точно также, как это делает бравузер.      
      */
      if(cookie != null)
      connection.setRequestProperty("Cookie",cookie);

      return connection;
    }
    catch(Exception e){
      e.printStackTrace();
      return null;
    }
  }


Теперь можно пользоваться этим методом в цикле. Цикл как раз отбрабатывает возможные редиректы, которые мы запретили делать автоматически. 


Код

public static String getResponse(String host, String query) throws Exception{
    String cookie = null;
    String response = null;
    String location = null;
    int code = 0;
    HttpURLConnection connection = null;

    while(true){

          connection = newConnection(host+query, cookie);
          connection.connect();

         //читаем ответ сервера
        code = connection.getResponseCode();
        cookie = connection.getHeaderField("Set-Cookie");
        

        
        if(code == 200) {
           response = readResponse(connection);
           break;//"OK"
        }
        else
        if(code == 302) {
           /*редирект, если имеет место. Сервер нам сообщает новый адрес. */
           location = connection.getHeaderField("Location");
           /*
               далее частный случай, когда редирект в пределах того же хоста,
               но в общем случае логика должна быть расширена
            */
           if(location.startsWith("./")) {
             /*
               здесь мы формируем новый адрес и возвращаемся в начало цикла,
               т.е. новый запрос по новому адресу, но куки, если они были нам присланы, 
                будут записаны в новый запрос.
             */
             location = location.substring(2);
             query = location; 
          }
        else {
          System.err.println("Error: code="+code +" host="+host+" query="+query);
          break; /*все остальные коды не обрабатываем*/
        }


           
        }



        
    }

    connection.disconnect(); 
    return response;
}

private static String readResponse(HttpURLConnection connection){
    try {
      InputStreamReader stream = new InputStreamReader(connection.getInputStream());
      BufferedReader in = new BufferedReader(stream);
      String response = in.readLine();

      return response;
    }
    catch (IOException ex) {
      ex.printStackTrace();
      return null;
    }
  }




Поскольку я все это выковыривал из существующего кода, то возможны ошибки. Это всего лишь пример, иллюстрирующий идею.  
 

Это сообщение отредактировал(а) COVD - 16.7.2007, 18:20
PM MAIL   Вверх
Sliva
Дата 17.7.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Ох! Спасибо!!! Только еще скажите - я должна изначально обращаться к адресу
Код

www.aaa.ru/bbb/ccc

???
PM   Вверх
COVD
Дата 17.7.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Как уже советовали выше, вам надо сначала обратиться к той странице, где сервер открывает новую сессию и возвращает sessionID в виде куки. Вы можете просто отправлять запросы на разные страницы и выводить в консоль значение куки из ответа. Там, где оно не равно null , это и будет искомая страница.

А потом уже использовать значение куки для обращения к нужной вам странице. 
PM MAIL   Вверх
Sliva
Дата 2.8.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



 smile  Пробую ваш пример и у меня не получается! Что я делаю не такб может ошибка при вызове в main? Подскажите, пожалуйста!
Код

public class httpConnection {
    private static HttpURLConnection newConnection(String request, String cookie){
        try {
//запрос к нужной странице
        request = "http://www.aaa/bbb/ccc";
        URL url = new URL(request);
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        String cookieVal = connection.getHeaderField("Set-Cookie");
        System.out.println("cookieVal = " + cookieVal);
        String sessionId;
        if(cookieVal != null)
          {
                sessionId = cookieVal.substring(0, cookieVal.indexOf(";"));
                System.out.println("Session id = " + sessionId);
        
             }
//          запрет автоматического  перенаправления  
       connection.setInstanceFollowRedirects(false);
     connection.setUseCaches(false);
          //тип НТТР-запроса, который предполагается осуществить
          connection.setRequestMethod("GET");
          /*
          Если в предыдущем запросе сервер прислал куки (sessionID)      
          */
          if(cookie != null)
          connection.setRequestProperty("Cookie",cookie);
          System.out.println("Cookie " +  cookie);         
       
          return connection; 
       }
        catch(Exception e){
          e.printStackTrace();
          return null;
        }
      } 

    public static String getResponse(String host, String query) throws Exception{
        String cookie = null;
        String response = null;
        String location = null;
        int code = 0;
        HttpURLConnection connection = null;
         
        while(true){
              connection = newConnection(host+query, cookie);
              connection.connect();
             //ответ сервера - код ответа НТТР-сервера в виде целого числа
            code = connection.getResponseCode();
            cookie = connection.getHeaderField("Set-Cookie");
                      
            if(code == 200) {
               response = readResponse(connection);
               break;//"OK"
            }
            else
            if(code == 302) {
               /*рСервер сообщает новый адрес. */
               location = connection.getHeaderField("Location");
               if(location.startsWith("./")) {
                 /*
                 новый запрос по новому адресу,
                  куки  записаны в новый запрос.
                 */
                 location = location.substring(2);
                 query = location; 
              }
            else {
              System.err.println("Error: code="+code +" host="+host+" query="+query);
              break; /*все остальные коды не обрабатываем*/
            }
       }       
        }
        connection.disconnect(); 
        return response;
    }
    private static String readResponse(HttpURLConnection connection){
        try {
          InputStreamReader stream = new InputStreamReader(connection.getInputStream());
          BufferedReader in = new BufferedReader(stream);
          String response = in.readLine();
          return response;
        }
        catch (IOException ex) {
          ex.printStackTrace();
          return null;
          }
      }    
    public static void main(String[] args)throws Exception {
    System.out.println("Test");
// обращение к главной странице
                getResponse("http://www.aaa.ru", "GET");
    }
}


Я так понимаю, что надо сначала подключиться к главной странице, потом к следующей (любой), чтобы перехватить sessionId и с ним подключиться к нужной, а реализовать у меня это не получается. Help!!!
PM   Вверх
mantracoder
Дата 3.8.2007, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.8.2007

Репутация: нет
Всего: 1



Sliva, с какого сайта и какие файлы Вы пытаетесь скачать? Киньте ссылку пожалуйста. Я могу накидать Вам небольшой, но работающий пример, который Вы уже дальше будете совершенствовать по собственному разумению.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.