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