![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Приветы, многоуважаемые гуру
Я разбираюсь в одном перловом скрипте. и у меня, как у полного новичка в этой области возник вопрос. Как мне в скрипте узнать, были ли уже высланы заголовки на клиента? Мне это необходимо, чтобы узнать, можно ли ещё послать куки и, или уже всё поздно. |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
Прочитать их Любой броузер при запросе к любому адресу отпраляет куки установленные для этого URI. Соответственно скрипт может ему в ответе поставить новые... Есть несколько модулей для работы с куками, но самый распространненый способ я думаю это соответствующие методы из CGI.pm. -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Я немного другое имейу ввиду.
После того, как я пишу:
Могу ли я как нибудь узнать, что куки больше не посадить, потому что print уже был? Не считайте меня за извращенца. Систему не я писал. А тот чувак бросается этими print cgi->header в коде где попало. Я систему авторизации на куки переделываю, поэтому мне важно узнать, ушёл заголовок, или нет. Если ушёл, а я пишу print cgi->header(@cookie), то естественно весь заголовок выводится в хтмл. А я хочу этого избежать. т.е лучше не трогать куки вообще. |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
А никак...
Только отслеживая вывод.... и анализируя ушел заголовок или нет... но имхо, это заплатка на заплатке проще переписать такое.... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| Zuzu |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 1 Всего: 4 |
Т.е., пусть будет такой код:
some_component1() some_component2() some_component3() могут вывести $cgi->header, а может и нет. (славно, правда? все бы программы так работали!) И в my_component() надо либо выводить $cgi->haeder(@cookie), если ни один из предыдущих компонентов его не вывел и не выводить, если (хотя-бы один) вывел. Причем some_component'ы написаны не тобой и нет ни времени, ни желания в них разбираться. Лучше бы, чтобы все изменения были сведены в них к минимуму (т.е. хочется такого "программистского счастья"). Все так? Или наоборот.
- запредить $cgi->header() для "нетвоих компонентов" Или совсем что-то другое? Это сообщение отредактировал(а) Zuzu - 29.1.2007, 11:27 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
||||||
|
|||||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Zuzu, абсолютно точное описание!
|
|||
|
||||
| Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 1 Всего: 4 |
Попробуй "обернуть" CGI.pm в обертку. Сделай свой класс, а наследуй все методы от CGI.pm. А метод header перепиши, чтобы он где-то запоминал, был он вызван или нет. Интересно, вынесет ли CGI.pm такое издевательство? Может и не вынести... Если у нас "счастливая объектная семья", то выполняется принцип замещаемости, т.е. если вместо CGI.pm ты будешь использовать свой класс-обертку, то вызывающей стороне должно быть абсолютно по барабану, использовать ли базовый класс либо класс-потомок. Т.е. все компоненты должны работать нормально и этого замещения не видеть. Другое дело, если кто-то из них будет работать с CGI.pm, как с пакетом (в понимании perl, т.е. экспортировать из него функции или обращаться к ним напрямую), а не посредством его "объектного вызова" - тогда, естественно, это не спасет. Если разные модули работают с разными экземплярами CGI.pm (каждый сам делает для себя экземпляр объекта командой my $cgi = new CGI), то можно "хранить ключик вызова" в переменной пакета myCGI. Иначе (что, на самом деле более правильно с точки зрения ООП) - в данных экземпляра. Как у тебя - непонятно, поэтому в примере хранится в "пакетной переменной". Вот пример кода класса-обертки:
Код писал прямо в форум, поэтому может и не работать. Но идею постарался изложить понятно. Добавлено @ 15:01 Естественно, надо либо в компонентах заменить вызов (use CGI на use myCGI), назвать файл myCGI.pm и т.д. и т.п. P.S. Да, заплатка на заплатке получается... Это сообщение отредактировал(а) Zuzu - 29.1.2007, 16:59 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
| Materium |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 4.12.2006 Где: Питер Репутация: нет Всего: 2 |
Кста, куки можно записывать сколь угодно, но приходится под каждую запись кука отводить свой cgi файл, так как только один заголовок моно передать в одном файле. Это тупо конечно.
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok"; |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
А поподробнее можна пожалста.... А то мне предстоит еще много работы с куками... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| Materium |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 4.12.2006 Где: Питер Репутация: нет Всего: 2 |
Nab, ну я по сравнению с вами конечно фигово разбираюсь.
Я тоже столкнулся с проблемой, когда мне нужно было записать куку. Я её записал, но потом в том же скрипте мне нужно было ещё одну куку записать, другую. А заголовок я уже посылал, записывая первую куку. И при повторном отпрпавлении заголовка, всем известно, кука просто выводится на экран и всё. Ну я нашёл тупой способ, записал вторую куку из другого cgi файла. Это наверное тупо, но меня устроило потому что именно тот, второй скрипт обрабатывал то, что мне нужно. В итоге у меня в папке с кукесами в винде есть один файл кука, соответствующий определённому адресу (в частности, например, локальному), но в нём несколько записей в одну строку. То есть несколько куков. При получение кука ни браузер, ни что другое не запутается, и выдаст вам значение того кука, имя которого вы указываете. Я надеюсь что ничего нового я не открыл. --------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok"; |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
Materium, без обид, но прежде чем что-то писать, тем более в утвердительной и безоговорочной интонации стоит подумать хоть немного, и всесторонне рассмотреть вопрос....
И большая рекомендация, начните изучать сторонние модули, и как самый полезный думаю лучше всего начать с CGI.pm. В нем реализованы очень интересные решения как архитектурого плана, так и работа со всемозможным CGI окружением... И если делать все правильно используя его методы то таких утверждений я надеюсь от вас больше не будет... Он конечно не образец быстродействия, но он реально очень универсален и поможет во многих случаях при работе с веб... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Вынесет. Я как-то уже сталкивался с аналогичной проблемой. Только придётся переопределить некоторые методы, например param(). -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Ребята, спасибо за поддержку! Я всё таки применил усердие и отделил мух от котлет
Но думаю многим инфа с этого топа будет в помощь |
|||
|
||||
| Marlik |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 212 Регистрация: 25.2.2007 Где: Рязань Репутация: нет Всего: нет |
Очень приятно через пару лет появится на форуме и встретить старых модеров, кстати а не проще-ли обойтись вообще без куки, полезность здесь только одна: Здравствуйте многоуважаемый, после вашего посещения было столько-то сообщений... может я не прав?
|
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
Это Вы о чем? -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
| Marlik |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 212 Регистрация: 25.2.2007 Где: Рязань Репутация: нет Всего: нет |
Ну, в основном куки только для того что-бы запомнить юзера, по крайней мере это используется везде и повсеместно...
А вот меня вопрос интересует: Зашел чел на сайт, я списал его переменные окружения, создал сессию, идентификатор положил ему в куки, ну и заодно вложил в hidden, чел оборвал Интернет, а куки у него стираются после выключения браузера(установки у него такие как у меня), потом чел зашел снова, я проверил его переменные окружения и обнаружил его сессию, предложил ввести пароль и прикинь он совпал с паролем в сессии!!! Теперь вопрос, можно-ли с куками так-же извращатся? И если они стерлись, как удостоверится что юзер тот-же самый, не спрашивая пароль? |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
Marlik, а зачем стирать? Если сам чел хотел более не вводить пароль, он и поставил "галочку" - "Запомнить меня".
|
|||
|
||||
| Marlik |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 212 Регистрация: 25.2.2007 Где: Рязань Репутация: нет Всего: нет |
Вот проблемма-то, куки кладу а прочитать не получается, у кого есть правильный вариант в одну две строчки? Где-то ошибаюсь и не знаю где.
|
|||
|
||||
| Nab |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
Вот так у меня формируется уникальный номер сессии, и время жизни 10 минут:
Следующий код к делу не относиться, но так я сохраняю инфу в сессии, хотя и рекомендую использовать CGI::Session... Просто эта реализация у меня есть простой метод аутентификации админа, поэтому админская сессия только одна , и в потомках будет переопределена. Но уже в базовом ядре моей разработки есть минимальная, весьма надежная аутентификация, что меня на начальном этапе более чем устраивает... Правда полная схема немного сложнее, но не об этом речь
а получаю так:
Кстати по поводу получения, возникла проблема с Opera, не всегда при переходе с другого домена кука воспринимается, просто ссылка для входа отсылается на мыло, и если юзают web-mail, то при нажатии в письме на ссылке в gmail к примеру , кука не доходила PS: А работу напрямую с куками, без CGI.pm можно поглядеть на примере реализации альтернативного модуля, форумчанином BlackLFL http://forum.vingrad.ru/topic-83358.html Это сообщение отредактировал(а) Nab - 4.3.2007, 18:57 -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
||||||
|
|||||||
| Marlik |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 212 Регистрация: 25.2.2007 Где: Рязань Репутация: нет Всего: нет |
Да, отлично, все работает, но есть один вопрос: вот посмотрел куки и обнаружил что у некоторых кук есть имя, а вот у других только значения которые положил админ, и я вот подумал а что если положить куку но не указать имя, и к примеру указать домен, получиться-ли что только с определенного домена эту куку можно прочитать, или это все предположения и я ошибаюсь???
Как такую куку кладут, без имени? |
|||
|
||||
| Nab |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 25.3.2006 Где: Kiev Репутация: 8 Всего: 37 |
На счет пустого имени вот что скажу, проверил на таком скрипте:
Первый раз куки ставяться, а вот второй раз еще и выводяться педыдущие. Время поставил на час вперед. Так вот пустую куку воспринял у меня только IE, Opera такую фигню не захотела воспринимать. У друга ФФ тоже воспринял пустую Так что вот обнаружился еще один способ проверки клиента, и определения каким броузером к нам зашли А вот по поводу домена, то да, если куку положил один домен то другой прочитать не сможет... Вернее ему чужая кука может быть отправлена только кривым агентом (броузером, программой, и т.д.) Можно не только домен указать но еще и более точный путь к скрипту для которого кука предназначена... -------------------- Чтобы правильно задать вопрос нужно знать больше половины ответа... Perl Community FREESCO in Ukraine |
|||
|
||||
![]()
|
| Правила форума "Perl: CGI программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |