COOKIE: Идентификация пользователей
В данном параграфе мы рассмотрим использование COOKIE при разработке CGI-программ.
См. также пятую главу, параграф COOKIE.
Часто механизм COOKIE используется для идентификации пользователей. Мы напишем программу, которая
выводит приветствие. Если в броузере пользователя уже установлено COOKIE, то
выводится приветствие:
Hello, Василий Пупкин!
Иначе, предложение ввести свое имя:
Далее вы видите эту программу в действии. Введите свое имя, нажмите кнопку и после перезагрузки
страницы вы увидите приветствие. В данном случае cookie устанавливается на 60 секунд.
Через одну минуту, если вы перезагрузите страницу, то этого приветствия не увидите.
Здесь это сделанно специально, чтобы была возможность поиграть с cookie. Ниже будут рассмотрены
программы, которые позволяют просматривать список всех установленных cookie и самому устанавливать
параметры cookie.
[an error occurred while processing this directive]
Исходный код программы приветствия "hello" выглядит следующим образом.
//hello.c
#include <itcgi.h>
int main()
{
LString* value = CreateString();
printf("Content-type: text/html\n\n");
if( GetCookieValueByName("name", value) )
printf("Hello, %s!\n", *value);
else
printf("<form method=post action=/cgi-bin/setcookie>\
<input type=hidden name=name value=name><br>\
What is your name? <input type=text name=value><br>\
<input type=hidden name=seconds value=60>\
<input type=submit></form>");
DeleteString(value);
return 0;
}
========Makefile=======
all: hello
hello: hello.c itcgi.a
gcc hello.c -L/usr/local/lib/mysql -I/usr/local/include/mysql \
-L/usr/local/lib -I/usr/local/include \
-o hello -lmysqlclient /usr/lib/itcgi.a -Wall -O3
strip hello
cp hello /www/members/cgi-bin/hello
|
Как вы видите, текст программы предельно простой. Если удалось получить значение
параметра cookie с именем "name", то выводим приветствие. Если нет, то выводим HTML-форму,
где пользователь сможет указать свое имя. Рассмотрим эту HTML-форму более подробно
<form method=post action=/cgi-bin/setcookie>\
<input type=hidden name=name value=name><br>\
What is your name? <input type=text name=value><br>\
<input type=hidden name=seconds value=60>\
<input type=submit></form>
|
Форма обрабатывается программой setcookie, которую мы рассмотрим чуть ниже.
На вход этой программы приходит три параметра. Первый - имя параметра cookie,
второй - значение и третий - это время в секундах, срок жизни этого cookie.
В данном случае первый и третий параметры невидимы, т.к. демонстрируется программа
приветствия, в которой нас интересует только второй параметр - ваше имя.
Исходный текст программы setcookie.
//setcookie.c
#include <itcgi.h>
int main()
{
LString* name = CreateString();
LString* value = CreateString();
LString* seconds = CreateString();
//считываем три параметра
GetParamByName("name", name);
GetParamByName("value", value);
GetParamByName("seconds", seconds);
//устанавливаем cookie
SetCookieForNSeconds(*name, *value, atoi(*seconds), "/docs/web", 0, 0);
//возвращаем пользователя на страницу, с которой была запущена
// данная программа
printf("Location: %s\n\n", getenv("HTTP_REFERER"));
DeleteString(name);
DeleteString(value);
DeleteString(seconds);
return 0;
}
=====Makefile=====
all: setcookie
setcookie: setcookie.c itcgi.a
gcc setcookie.c -L/usr/local/lib/mysql -I/usr/local/include/mysql \
-L/usr/local/lib -I/usr/local/include \
-o setcookie -lmysqlclient /usr/lib/itcgi.a -Wall -O3
strip setcookie
cp setcookie /www/members/cgi-bin/setcookie
|
Обратите внимание на четвертый параметр функции SetCookieForNSeconds - "/docs/web".
Это путь на сайте, где лежит моя книга и все html-файлы, для которых будет действовать
cookie. Также интерес представляет заголовок, который печатает данная программа.
printf("Location: %s\n\n", getenv("HTTP_REFERER"));
Переменная окружения HTTP_REFERER содержит URL страницы, с которой была запущена HTML-форма
или вызывана данная программа. Заголовок Location: означает, что броузер пользователя
должен будет открыть этот URL. Такой прием возврата на страницу используется довольно часто.
Я бы, конечно, мог написать в явной форме
printf("Location: http://members.itsoft.ru/docs/web/chapter8.html\n\n");
но тогда, при переносе книги на другой сайт, что собственно и будет сделано
после ее завершения, мне придется исправлять исходные коды программ и перекомпилировать их.
А рассмотренный пример универсален - не зависит от сайта, на котором будет находится HTML-форма.
Далее мы рассмотрим программу listcookie - полный список cookie-параметров.
Вот вы ее видите в действии.
[an error occurred while processing this directive]
Ниже, форма для установки параметров, которая обрабатывается выше рассмотренной программой
setcookie. Установите новый параметр и вы увидите, как он добавится в список.
Исходный текст listcookie
// listcookie.c
#include <itcgi.h>
int main()
{
LString* name = CreateString();
LString* value = CreateString();
int i, count;
count = GetCookieCount(); // получаем общее количество параметров
printf("Content-type: text/html\n\n");
// выводим HTML-код таблицы
printf("<table border=\"1\"><caption>Полный список\
COOKIE-параметров</caption><tr><td\
bgcolor=\"E5E5E5\">Индекс<td bgcolor=\"E5E5E5\">Имя<td\
bgcolor=\"E5E5E5\">Значение");
// в цикле проходим по всем параметрам
for(i=0;i<count;i++)
{
GetCookieValueByIndex(i, value); // получаем значение параметра по его индексу
GetCookieNameByIndex(i, name); // получаем имя параметра
printf("<tr><td>%d <td> %s <td> %s\n", i, *name, *value);
}
printf("</table>");
DeleteString(name); // освобождаем память
DeleteString(value);
return 0;
}
=====Makefile=====
all: listcookie
listcookie: listcookie.c itcgi.a
gcc listcookie.c -L/usr/local/lib/mysql -I/usr/local/include/mysql \
-L/usr/local/lib -I/usr/local/include \
-o listcookie -lmysqlclient /usr/lib/itcgi.a -Wall -O3
strip listcookie
cp listcookie /www/members/cgi-bin/listcookie
|
Данная программа почти полностью аналогична программе listcgi. Отличие в названии
функций, работающих с CGI и COOKIE параметрами.
|