Russian Qt Forum
Май 10, 2024, 03:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: как чистить QNetworkAccessManager  (Прочитано 16381 раз)
eldar85
Гость
« : Декабрь 25, 2010, 17:50 »

Добрый день. Такая задачька, делаю класс для работы с сетью. Проблема в том что не знаю как отчистить QNetworkAccessManager. К примеру я логинюсь на каком нить сайте, а потом не убивая этого манеждера снова залогиниться другим аккаунтом, но само собой заходит опять на страничку первого аккаунта. QNetworkReply очищаю, QNetwprkRequest создается при каждом логине новый. А как очищать QNetworkAccessManager чтобы при логине другим акком все же открывалась страничка имено второго аккаунта. Сначала делал чтобы для каждого раза создавался новый QNetworkAccessManager а старый удалялся, но все же хочу сделать что бы работа продолжалась с тем же акком. Документацию понимаю плохо, но все же прочел всю по QNetworkAccessManager но так не разобрался что же очистит в нем и куки и прочее. В общем убить сессию созданную при первом логине.
Прошу совета у тех кто знает.
« Последнее редактирование: Декабрь 25, 2010, 19:32 от eldar85 » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #1 : Декабрь 25, 2010, 20:19 »

Слишком скромно описана ситуация. Перед тем как логинишься под вторым акком, нажимаешь там "выход" или что именно делаешь? Url сайта какой на тот момент? Возможно дело не в Qt, а в сервере. Передаёт по урл какие-нибудь идентификаторы сессии, по ним тебя и логинит. У себя на сайтах пробовал - всё ок, заходит под тем, под которым логинюсь.
Записан

kubuntu/Win7/x64/NetBeans
SimpleSunny
Гость
« Ответ #2 : Декабрь 25, 2010, 21:23 »

Скорее всего поможет
manager->setCookieJar(new QNetworkCookieJar());

или
manager->setCookieJar(0);
но тогда надо будет вручную следить за куками
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #3 : Декабрь 25, 2010, 21:26 »

Скорее всего поможет
manager->setCookieJar(new QNetworkCookieJar());

или
manager->setCookieJar(0);
но тогда надо будет вручную следить за куками
А какой в этом смысл? При перелогине кукизы перезаписываются. Собственно поэтому и нет метода типа manager->clearCookies()
« Последнее редактирование: Декабрь 26, 2010, 01:50 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
SimpleSunny
Гость
« Ответ #4 : Декабрь 25, 2010, 21:33 »

Насколько я понял, запрашивается страница логина с уже залогиненым пользователям и он автоматом перекидывается на свой профиль.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #5 : Декабрь 25, 2010, 21:45 »

Насколько я понял, запрашивается страница логина с уже залогиненым пользователям и он автоматом перекидывается на свой профиль.
Имеешь ввиду, что скрипт сайта проверяет наличие нужных для авторизации кукизов и если они есть, то их и использует без перезаписи? Если это так, то вебдевелоперы пишущие такие скрипты имхо неадекватны. Кроме того, в таком случае перекидывалось бы на первый акк и в обычных браузерах о чём автор не упоминал. Хз вобщем, пусть ТС проверяет.
Записан

kubuntu/Win7/x64/NetBeans
eldar85
Гость
« Ответ #6 : Декабрь 25, 2010, 21:56 »

куки записываются новые у второго аккаунта, я проверял. Куки точно очищаются. Делаю так, открывается главная страница логина, логинюсь и открываю страницу пользователя, посмотрел и хочу логиниться другим акком. Но открывается опять страница первого аккаунта. А если я новым менеджером логиняюсь то старая сессия сбрасывается, а я хотел с тем же менеджером продолжить, но хотелось бы полностью очищать менеджер содержащий информацию о предыдущей сессии
Записан
eldar85
Гость
« Ответ #7 : Декабрь 25, 2010, 21:58 »

и если не сложно помогите понять как получить куки и установить их в менееджер нормально. Если можно более понятный небольшой примерчик.
Записан
eldar85
Гость
« Ответ #8 : Декабрь 25, 2010, 22:02 »

в обычном браузере если не разлогинишься то так же не возможно вторым акком залогиниться. О одекватности сайта говорить сложно, они боряться со спамом (vkontakte.ru) поэтому там я думаю как вы и описали. Так вот интересно что еще кроме кукисов менеджер в себя сохраняет. Потому что кукисы новые получает а аккаунт тот же.
« Последнее редактирование: Декабрь 26, 2010, 01:15 от eldar85 » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #9 : Декабрь 25, 2010, 22:07 »

в обычном сайте если не разлогинишься
Ну естественно надо разлогиниться, т.к. файлы сессий могут храниться и на сервере, у них скорее всего так и есть. И файлы эти очищаются на момент разлогирования. А ты что хочешь, залогиниться новым предварительно не разлогиниваясь? Очень сомневаюсь что дело в кукизах. Но так, на всякий случай:

RemadedNetworkCookieJar.h:
Код
C++ (Qt)
#ifndef _MYNETWORKCOOKIEJAR_H
#define _MYNETWORKCOOKIEJAR_H
 
#include <QList>
#include <QNetworkCookie>
 
class RemadedNetworkCookieJar: public QNetworkCookieJar
{
public:
RemadedNetworkCookieJar();
virtual ~RemadedNetworkCookieJar();
QList<QNetworkCookie> getAllCookies();
void setAllSitesCookies(const QList<QNetworkCookie>& cookieList);
};
 
#endif
/* _MYNETWORKCOOKIEJAR_H */
 

RemadedNetworkCookieJar.cpp:
Код
C++ (Qt)
#include "RemadedNetworkCookieJar.h"
 
RemadedNetworkCookieJar::RemadedNetworkCookieJar() {}
 
QList<QNetworkCookie> RemadedNetworkCookieJar::getAllCookies()
{
return this->allCookies();
}
 
void RemadedNetworkCookieJar::setAllSitesCookies(const QList<QNetworkCookie>& cookieList)
{
this->setAllCookies(cookieList);
}
 
RemadedNetworkCookieJar::~RemadedNetworkCookieJar() { }
 

Пример установки новых кукизов:
Код
C++ (Qt)
this->jar = new RemadedNetworkCookieJar();
this->webView.page()->networkAccessManager()->setCookieJar(this->jar);
 

Т.е. всё предельно просто.
п.с. Скорее всего дело в SESSION_ID. Т.е. в момент авторизации под первым акком на сервере создаётся файл с парами типа "user=nickname; info1=1234" и т.п. и каждый раз твоему манагеру передаётся SESSION_ID, который он передаст назад серверу при следующем запросе, чтоб сервер знал из какого файла сессии читать данные. При разлогировании файл удалятся, при след. авторизации создаётся новый. Примерно так, но могу ошибаться.
« Последнее редактирование: Декабрь 25, 2010, 22:23 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
SimpleSunny
Гость
« Ответ #10 : Декабрь 25, 2010, 22:42 »

А в какие этапы у вас проходит авторизация? У меня есть смутные сомнения, что вы не очистили lp куки на login.vk.com, поэтому когда вы запрашиваете эту страницу, вам выдаются сессионные куки как раз первого аккаунта (для которого были первоначально установлены эти куки), а вы ожидаете сессионные куки для второго аккаунта. Перед новой авторизацией, очистите все куки, как я показал выше, и все будет нормально.
Записан
eldar85
Гость
« Ответ #11 : Декабрь 26, 2010, 01:24 »

Скорее всего поможет
manager->setCookieJar(new QNetworkCookieJar());

или
manager->setCookieJar(0);
но тогда надо будет вручную следить за куками

Большое спасибо - этот метод помог и в правду открыв второй раз страницу логина со старыми куками тупо срабатывал переброс на главную страницу первого акка)
Код:
manager->setCookieJar(new QNetworkCookieJar());
помоглою
Записан
eldar85
Гость
« Ответ #12 : Декабрь 26, 2010, 01:27 »

в обычном сайте если не разлогинишься
Ну естественно надо разлогиниться, т.к. файлы сессий могут храниться и на сервере, у них скорее всего так и есть. И файлы эти очищаются на момент разлогирования. А ты что хочешь, залогиниться новым предварительно не разлогиниваясь? Очень сомневаюсь что дело в кукизах. Но так, на всякий случай:

RemadedNetworkCookieJar.h:
Код
C++ (Qt)
#ifndef _MYNETWORKCOOKIEJAR_H
#define _MYNETWORKCOOKIEJAR_H
 
#include <QList>
#include <QNetworkCookie>
 
class RemadedNetworkCookieJar: public QNetworkCookieJar
{
public:
RemadedNetworkCookieJar();
virtual ~RemadedNetworkCookieJar();
QList<QNetworkCookie> getAllCookies();
void setAllSitesCookies(const QList<QNetworkCookie>& cookieList);
};
 
#endif
/* _MYNETWORKCOOKIEJAR_H */
 

RemadedNetworkCookieJar.cpp:
Код
C++ (Qt)
#include "RemadedNetworkCookieJar.h"
 
RemadedNetworkCookieJar::RemadedNetworkCookieJar() {}
 
QList<QNetworkCookie> RemadedNetworkCookieJar::getAllCookies()
{
return this->allCookies();
}
 
void RemadedNetworkCookieJar::setAllSitesCookies(const QList<QNetworkCookie>& cookieList)
{
this->setAllCookies(cookieList);
}
 
RemadedNetworkCookieJar::~RemadedNetworkCookieJar() { }
 

Пример установки новых кукизов:
Код
C++ (Qt)
this->jar = new RemadedNetworkCookieJar();
this->webView.page()->networkAccessManager()->setCookieJar(this->jar);
 

Т.е. всё предельно просто.
п.с. Скорее всего дело в SESSION_ID. Т.е. в момент авторизации под первым акком на сервере создаётся файл с парами типа "user=nickname; info1=1234" и т.п. и каждый раз твоему манагеру передаётся SESSION_ID, который он передаст назад серверу при следующем запросе, чтоб сервер знал из какого файла сессии читать данные. При разлогировании файл удалятся, при след. авторизации создаётся новый. Примерно так, но могу ошибаться.

Большое спасибо за пример, давно хочу сделать подстановку куки руками а не с помощью кукиджар. ))
Записан
eldar85
Гость
« Ответ #13 : Декабрь 26, 2010, 01:29 »

проблема решена))) Не представляете как помогли вы мне SimpleSunny и serg_hd, я дня два ходил сам не свой, когда проблему не получается решить уснуть даже нормально не могу)) Еще раз большое спасибо)
Записан
eldar85
Гость
« Ответ #14 : Декабрь 26, 2010, 01:34 »

а вот этот метод
Код:
manger->clearCookies()
я так искал, все перечитал... Жаль что его нет, на мой взгляд очень нужная вещь) вот в моей задаче не было бы головняков если бы такой метод имел место быть)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.17 секунд. Запросов: 22.