Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CGI. Как узнать, можно ли посадить куки, или заголовки уже на клиенте 
:(
    Опции темы
sergejzr
Дата 25.1.2007, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Приветы, многоуважаемые гуру smile

Я разбираюсь в одном перловом скрипте. и у меня, как у полного новичка в этой области возник вопрос.
Как мне в скрипте узнать, были ли уже высланы заголовки на клиента?
Мне это необходимо, чтобы узнать, можно ли ещё послать куки и, или уже всё поздно.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Nab
Дата 25.1.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(sergejzr @  25.1.2007,  10:35 Найти цитируемый пост)
Как мне в скрипте узнать, были ли уже высланы заголовки на клиента?

Прочитать их smile

Любой броузер при запросе к любому адресу отпраляет куки установленные для этого URI.
Соответственно скрипт может ему в ответе поставить новые...

Есть несколько модулей для работы с куками, но самый распространненый способ я думаю это соответствующие методы из CGI.pm.



--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
sergejzr
Дата 25.1.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Я немного другое имейу ввиду. 
После того, как я пишу:

Код

$cgi=new CGI;
print cgi->header();


Могу ли я как нибудь узнать, что куки больше не посадить, потому что print уже был?

Не считайте меня за извращенца. Систему не я писал. А тот чувак бросается этими print cgi->header в коде где попало. 
Я систему авторизации на куки переделываю, поэтому мне важно узнать, ушёл заголовок, или нет. Если ушёл, а я пишу
print cgi->header(@cookie), то естественно весь заголовок выводится в хтмл. А я хочу этого избежать. т.е лучше не трогать куки вообще.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Nab
Дата 25.1.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А никак... smile
Только отслеживая вывод.... и анализируя ушел заголовок или нет...
но имхо, это заплатка на заплатке smile
проще переписать такое....


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Zuzu
Дата 29.1.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(sergejzr @  25.1.2007,  19:04 Найти цитируемый пост)
Могу ли я как нибудь узнать, что куки больше не посадить, потому что print уже был?


Т.е., пусть будет такой код:

Код

some_component1();
some_component2();
some_component3();

my_component();



some_component1() some_component2() some_component3() могут вывести $cgi->header, а может и нет. (славно, правда? все бы программы так работали!)

И в my_component() надо либо выводить $cgi->haeder(@cookie), если ни один из предыдущих компонентов его не вывел и не выводить, если (хотя-бы один) вывел.

Причем some_component'ы написаны не тобой и нет ни времени, ни желания в них разбираться. Лучше бы, чтобы все изменения были сведены в них к минимуму (т.е. хочется такого "программистского счастья").

Все так?

Или наоборот.

Код

my_component();

some_component1();
some_component2();
some_component3();


- запредить $cgi->header() для "нетвоих компонентов"

Или совсем что-то другое?


Это сообщение отредактировал(а) Zuzu - 29.1.2007, 11:27
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
sergejzr
Дата 29.1.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Zuzu, абсолютно точное описание! smile

Цитата

some_component1() some_component2() some_component3() могут вывести $cgi->header, а может и нет.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Zuzu
Дата 29.1.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



smile Славная проблема! Не пожелал бы и врагу ее решать! Исключение - когда система изначально была спроектирована с "такой фишкой"!

Попробуй "обернуть" CGI.pm в обертку. Сделай свой класс, а наследуй все методы от CGI.pm. А метод header перепиши, чтобы он где-то запоминал, был он вызван или нет. Интересно, вынесет ли CGI.pm такое издевательство? Может и не вынести...

Если у нас "счастливая объектная семья", то выполняется принцип замещаемости, т.е. если вместо CGI.pm ты будешь использовать свой класс-обертку, то вызывающей стороне должно быть абсолютно по барабану, использовать ли базовый класс либо класс-потомок. Т.е. все компоненты должны работать нормально и этого замещения не видеть. Другое дело, если кто-то из них будет работать с CGI.pm, как с пакетом (в понимании perl, т.е. экспортировать из него функции или обращаться к ним напрямую), а не посредством его "объектного вызова" - тогда, естественно, это не спасет. Если разные модули работают с разными экземплярами CGI.pm (каждый сам делает для себя экземпляр объекта командой my $cgi = new CGI), то можно "хранить ключик вызова" в переменной пакета myCGI. Иначе (что, на самом деле более правильно с точки зрения ООП) - в данных экземпляра. Как у тебя - непонятно, поэтому в примере хранится в "пакетной переменной".

Вот пример кода класса-обертки:

Код

#!/usr/bin/perl

package myCGI;

use strict;

our $__HEADER_METHOD_WAS_RUNED_MORE_THAT_ONCE = 0;  
# что-нибудь пострашнее, чтобы не было пересечений c CGI.pm, прости за мой английский! :)

use base qw/CGI/;         # наследуем от CGI.pm  - он такого издевательства может и не вынести!

#
# переопределение метода header 
# моих ехидных комментариев зжесь больше, чем кода.
#
sub header { 
my $self = shift;

unless ($myCGI::__HEADER_METHOD_WAS_RUNED_MORE_THAT_ONCE) {
  $myCGI::__HEADER_METHOD_WAS_RUNED_MORE_THAT_ONCE = 1;   # возведем ключ в пакете
  #
  # Метод супер-класса - старый header - нужно вызвать - кто-то ведь должен работать!
  # А в принципе его работа нас устраивает!
  #
  return $self->SUPER::header(@_);       # про параметры - не забываем!
  #
} else {
  #
  # Делать, собственно, особо нечего... Можно, для разнообразия, вывести куда-нибудь сообщение
  # и даже с помощью caller() (точный синтаксис не помню!)  определить откуда был вызван метод повторно.
  #
  warn "Calling heaвer again... Strange situation! \n";
  #
  return '';     # Пустую строку нужно вернуть... Ее будут пытаться выводить по print. Они-то не знают, что header подменили!
}

}
1;


Код писал прямо в форум, поэтому может и не работать. Но идею постарался изложить понятно.

Добавлено @ 15:01 
Естественно, надо либо в компонентах заменить вызов (use CGI на use myCGI), назвать файл myCGI.pm и т.д. и т.п.

P.S. Да, заплатка на заплатке получается...

Это сообщение отредактировал(а) Zuzu - 29.1.2007, 16:59
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
Materium
Дата 30.1.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Кста, куки можно записывать сколь угодно, но приходится под каждую запись кука отводить свой cgi файл, так как только один заголовок моно передать в одном файле. Это тупо конечно.
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
Nab
Дата 30.1.2007, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Materium @  30.1.2007,  19:04 Найти цитируемый пост)
Кста, куки можно записывать сколь угодно, но приходится под каждую запись кука отводить свой cgi файл, так как только один заголовок моно передать в одном файле. Это тупо конечно.

А поподробнее можна пожалста.... А то мне предстоит еще много работы с куками... 


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Materium
Дата 1.2.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Nab, ну я по сравнению с вами конечно фигово разбираюсь.
Я тоже столкнулся с проблемой, когда мне нужно было записать куку. Я её записал, но потом в том же скрипте мне нужно было ещё одну куку записать, другую. А заголовок я уже посылал, записывая первую куку. И при повторном отпрпавлении заголовка, всем известно, кука просто выводится на экран и всё.
Ну я нашёл тупой способ, записал вторую куку из другого cgi файла. Это наверное тупо, но меня устроило потому что именно тот, второй скрипт обрабатывал то, что мне нужно.
В итоге у меня в папке с кукесами в винде есть один файл кука, соответствующий определённому адресу (в частности, например, локальному), но в нём несколько записей в одну строку. То есть несколько куков. При получение кука ни браузер, ни что другое не запутается, и выдаст вам значение того кука, имя которого вы указываете.
Я надеюсь что ничего нового я не открыл.  smile 
--------------------
#!sub abc {return "ok"}${&abc()}="TMTOWTDI";print "$ok";
PM MAIL   Вверх
Nab
Дата 1.2.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Materium, без обид, но прежде чем что-то писать, тем более в утвердительной и безоговорочной интонации стоит подумать хоть немного, и всесторонне рассмотреть вопрос....

И большая рекомендация, начните изучать сторонние модули, и как самый полезный думаю лучше всего начать с CGI.pm.

В нем реализованы очень интересные решения как архитектурого плана, так и работа со всемозможным CGI окружением... И если делать все правильно используя его методы то таких утверждений я надеюсь от вас больше не будет...

Он конечно не образец быстродействия, но он реально очень универсален и поможет во многих случаях при работе с веб...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
korob2001
Дата 2.2.2007, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата(Zuzu @  29.1.2007,  11:46 Найти цитируемый пост)
Попробуй "обернуть" CGI.pm в обертку. Сделай свой класс, а наследуй все методы от CGI.pm. А метод header перепиши, чтобы он где-то запоминал, был он вызван или нет. Интересно, вынесет ли CGI.pm такое издевательство? Может и не вынести...

Вынесет.  smile
Я как-то уже сталкивался с аналогичной проблемой. Только придётся переопределить некоторые методы, например param().


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sergejzr
Дата 2.2.2007, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Ребята, спасибо за поддержку! Я всё таки применил усердие и отделил мух от котлет smile
Но думаю многим инфа с этого топа будет в помощь smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Marlik
Дата 25.2.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Очень приятно через пару лет появится на форуме и встретить старых модеров, кстати а не проще-ли обойтись вообще без куки, полезность здесь только одна: Здравствуйте многоуважаемый, после вашего посещения было столько-то сообщений... может я не прав?
PM WWW Skype   Вверх
Nab
Дата 26.2.2007, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Marlik @  25.2.2007,  17:54 Найти цитируемый пост)
одна: Здравствуйте многоуважаемый, после вашего посещения было столько-то сообщений... 

Это Вы о чем?


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


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

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


 




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


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

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