| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > CGI. Как узнать, можно ли посадить куки |
| Автор: sergejzr 25.1.2007, 10:35 |
| Приветы, многоуважаемые гуру Я разбираюсь в одном перловом скрипте. и у меня, как у полного новичка в этой области возник вопрос. Как мне в скрипте узнать, были ли уже высланы заголовки на клиента? Мне это необходимо, чтобы узнать, можно ли ещё послать куки и, или уже всё поздно. |
| Автор: sergejzr 25.1.2007, 16:04 | ||
| Я немного другое имейу ввиду. После того, как я пишу:
Могу ли я как нибудь узнать, что куки больше не посадить, потому что print уже был? Не считайте меня за извращенца. Систему не я писал. А тот чувак бросается этими print cgi->header в коде где попало. Я систему авторизации на куки переделываю, поэтому мне важно узнать, ушёл заголовок, или нет. Если ушёл, а я пишу print cgi->header(@cookie), то естественно весь заголовок выводится в хтмл. А я хочу этого избежать. т.е лучше не трогать куки вообще. |
| Автор: Nab 25.1.2007, 16:32 |
| А никак... Только отслеживая вывод.... и анализируя ушел заголовок или нет... но имхо, это заплатка на заплатке проще переписать такое.... |
| Автор: Zuzu 29.1.2007, 11:26 | ||||||
Т.е., пусть будет такой код:
some_component1() some_component2() some_component3() могут вывести $cgi->header, а может и нет. (славно, правда? все бы программы так работали!) И в my_component() надо либо выводить $cgi->haeder(@cookie), если ни один из предыдущих компонентов его не вывел и не выводить, если (хотя-бы один) вывел. Причем some_component'ы написаны не тобой и нет ни времени, ни желания в них разбираться. Лучше бы, чтобы все изменения были сведены в них к минимуму (т.е. хочется такого "программистского счастья"). Все так? Или наоборот.
- запредить $cgi->header() для "нетвоих компонентов" Или совсем что-то другое? |
| Автор: sergejzr 29.1.2007, 13:08 | ||
Zuzu, абсолютно точное описание!
|
| Автор: Zuzu 29.1.2007, 14:46 | ||
Попробуй "обернуть" 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. Да, заплатка на заплатке получается... |
| Автор: Materium 30.1.2007, 19:04 |
| Кста, куки можно записывать сколь угодно, но приходится под каждую запись кука отводить свой cgi файл, так как только один заголовок моно передать в одном файле. Это тупо конечно. |
| Автор: Nab 30.1.2007, 20:34 | ||
А поподробнее можна пожалста.... А то мне предстоит еще много работы с куками... |
| Автор: Materium 1.2.2007, 21:36 |
| Nab, ну я по сравнению с вами конечно фигово разбираюсь. Я тоже столкнулся с проблемой, когда мне нужно было записать куку. Я её записал, но потом в том же скрипте мне нужно было ещё одну куку записать, другую. А заголовок я уже посылал, записывая первую куку. И при повторном отпрпавлении заголовка, всем известно, кука просто выводится на экран и всё. Ну я нашёл тупой способ, записал вторую куку из другого cgi файла. Это наверное тупо, но меня устроило потому что именно тот, второй скрипт обрабатывал то, что мне нужно. В итоге у меня в папке с кукесами в винде есть один файл кука, соответствующий определённому адресу (в частности, например, локальному), но в нём несколько записей в одну строку. То есть несколько куков. При получение кука ни браузер, ни что другое не запутается, и выдаст вам значение того кука, имя которого вы указываете. Я надеюсь что ничего нового я не открыл. |
| Автор: Nab 1.2.2007, 22:17 |
| Materium, без обид, но прежде чем что-то писать, тем более в утвердительной и безоговорочной интонации стоит подумать хоть немного, и всесторонне рассмотреть вопрос.... И большая рекомендация, начните изучать сторонние модули, и как самый полезный думаю лучше всего начать с CGI.pm. В нем реализованы очень интересные решения как архитектурого плана, так и работа со всемозможным CGI окружением... И если делать все правильно используя его методы то таких утверждений я надеюсь от вас больше не будет... Он конечно не образец быстродействия, но он реально очень универсален и поможет во многих случаях при работе с веб... |
| Автор: korob2001 2.2.2007, 00:37 | ||
Вынесет. Я как-то уже сталкивался с аналогичной проблемой. Только придётся переопределить некоторые методы, например param(). |
| Автор: sergejzr 2.2.2007, 00:59 |
| Ребята, спасибо за поддержку! Я всё таки применил усердие и отделил мух от котлет Но думаю многим инфа с этого топа будет в помощь |
| Автор: Marlik 25.2.2007, 17:54 |
| Очень приятно через пару лет появится на форуме и встретить старых модеров, кстати а не проще-ли обойтись вообще без куки, полезность здесь только одна: Здравствуйте многоуважаемый, после вашего посещения было столько-то сообщений... может я не прав? |
| Автор: Nab 26.2.2007, 01:24 | ||
Это Вы о чем? |
| Автор: Marlik 2.3.2007, 00:00 |
| Ну, в основном куки только для того что-бы запомнить юзера, по крайней мере это используется везде и повсеместно... А вот меня вопрос интересует: Зашел чел на сайт, я списал его переменные окружения, создал сессию, идентификатор положил ему в куки, ну и заодно вложил в hidden, чел оборвал Интернет, а куки у него стираются после выключения браузера(установки у него такие как у меня), потом чел зашел снова, я проверил его переменные окружения и обнаружил его сессию, предложил ввести пароль и прикинь он совпал с паролем в сессии!!! Теперь вопрос, можно-ли с куками так-же извращатся? И если они стерлись, как удостоверится что юзер тот-же самый, не спрашивая пароль? |
| Автор: nitr 2.3.2007, 00:09 |
| Marlik, а зачем стирать? Если сам чел хотел более не вводить пароль, он и поставил "галочку" - "Запомнить меня". |
| Автор: Marlik 4.3.2007, 10:30 |
| Вот проблемма-то, куки кладу а прочитать не получается, у кого есть правильный вариант в одну две строчки? Где-то ошибаюсь и не знаю где. |
| Автор: Nab 4.3.2007, 18:13 | ||||||
Вот так у меня формируется уникальный номер сессии, и время жизни 10 минут:
Следующий код к делу не относиться, но так я сохраняю инфу в сессии, хотя и рекомендую использовать CGI::Session... Просто эта реализация у меня есть простой метод аутентификации админа, поэтому админская сессия только одна , и в потомках будет переопределена. Но уже в базовом ядре моей разработки есть минимальная, весьма надежная аутентификация, что меня на начальном этапе более чем устраивает... Правда полная схема немного сложнее, но не об этом речь
а получаю так:
Кстати по поводу получения, возникла проблема с Opera, не всегда при переходе с другого домена кука воспринимается, просто ссылка для входа отсылается на мыло, и если юзают web-mail, то при нажатии в письме на ссылке в gmail к примеру , кука не доходила PS: А работу напрямую с куками, без CGI.pm можно поглядеть на примере реализации альтернативного модуля, форумчанином BlackLFL http://forum.vingrad.ru/topic-83358.html |
| Автор: Marlik 6.3.2007, 21:29 |
| Да, отлично, все работает, но есть один вопрос: вот посмотрел куки и обнаружил что у некоторых кук есть имя, а вот у других только значения которые положил админ, и я вот подумал а что если положить куку но не указать имя, и к примеру указать домен, получиться-ли что только с определенного домена эту куку можно прочитать, или это все предположения и я ошибаюсь??? Как такую куку кладут, без имени? |
| Автор: Nab 7.3.2007, 02:01 | ||
На счет пустого имени вот что скажу, проверил на таком скрипте:
Первый раз куки ставяться, а вот второй раз еще и выводяться педыдущие. Время поставил на час вперед. Так вот пустую куку воспринял у меня только IE, Opera такую фигню не захотела воспринимать. У друга ФФ тоже воспринял пустую Так что вот обнаружился еще один способ проверки клиента, и определения каким броузером к нам зашли А вот по поводу домена, то да, если куку положил один домен то другой прочитать не сможет... Вернее ему чужая кука может быть отправлена только кривым агентом (броузером, программой, и т.д.) Можно не только домен указать но еще и более точный путь к скрипту для которого кука предназначена... |