Сайтостроительство
ac3ae3b5

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 параметрами.






Содержание раздела