Библиотека ITCGI Оглавление Упражнение: Персонализация веб-сайта

COOKIE: Идентификация пользователей

В данном параграфе мы рассмотрим использование COOKIE при разработке CGI-программ. См. также пятую главу, параграф COOKIE. Часто механизм COOKIE используется для идентификации пользователей. Мы напишем программу, которая выводит приветствие. Если в броузере пользователя уже установлено COOKIE, то выводится приветствие:
Hello, Василий Пупкин!
Иначе, предложение ввести свое имя:


What is your name?
Далее вы видите эту программу в действии. Введите свое имя, нажмите кнопку и после перезагрузки страницы вы увидите приветствие. В данном случае 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. Установите новый параметр и вы увидите, как он добавится в список.
name
value
seconds
Исходный текст 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 параметрами.