Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи мови JavaScript.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

7.2.5. Одержання cookie розширенням серверу Web

У цьому поділі приведений приклад документа HTML, що створює cookie, а також вихідні тексти розширення серверу ISAPI, що відображає на динамічно утворюваній сторінці заголовки HTTP цього документа. Коли браузер створює cookie, розширення серверу одержує заголовок НТТР_СООКIЕ і відображає його.

Документ аналогічний описаному раніше в поділі "Записна книжка Cookies Notepad".

Додатково в документі розміщена кнопка Send. За допомогою цієї кнопки уміст вікна редагування і заголовок HTTP_COOKIES передаються розширенню ISAPI серверу Web.

Вихідний текст документа HTML ви знайдете в листинге 7.4.

Листинг 7.4. Файл chapter7/NotebookISAPI/NotebookISAPI. htm

<HTML>

<HEAD>

<TITLE>Cookies demo</TITLE>

<SCRIPT LANGUAGE="JavaScript">

<!--

function addCookie(szName, szValue, dtDays Expires)

{

var dtExpires = new Date();

var dtExpiryDate = "";

dtExpires. setTime(dtExpires. getTime() + dtDaysExoires * 24 * 60 * 60 * 1000);

dtExpiryDare = dtExpires. toGMTString();

document. cookie = szName + "=" + escape (szValue) + ";

expires=" + dtExpiryDate;

}

function findCookie(szName)

{

var i=0;

var nStartPosition = 0;

var nEndPosition = 0;

var szCookieString = document.cookie;

var szTemp = "";

while (i <= szCookieString.length)

{

nStartPosition = i;

nEndPosition = nStartPosition + szName.length;

if(szCookieString.substring(nStartPosition, nEndPosition) == szName)

{

nStartPosition = nEndPosition + 1;

nEndPosition = document.cookie.indexOf(";",nStartPosition);

if(nEndPosition < nStartPosition)

nEndPosition = document.cookie.length;

szTemp = document.cookie.substring(nStartPosition, nEndPosition);

return unescape(szTemp);

break;

}

i++;

}

return "";

}

function removeCookie(szName)

{

var dtExpires = new Date();

dtExpires. setTime(dtExpires. getTime() - 1);

var szValue = findCookie(szName);

document. cookie = szName + "=" + szValue + "; expires=" + dtExpires.toGMTString();

}

function btnClick()

{

addCookie("My Text", Test Form.Cogent, value, 10);

}

//-->

</SCRIPT>

</HEAD>

<BODY BGCOLOR=white>

<Hl>Cookies Notepad</Hl>

<FORM NAME="TestForm" METHOD=POST ACTION="http://frolov/scripts/ishello.dll?">

<P><TEXTAREA NAME="Conmert"

ROWS="5" COLS="25" WRAP="physical">

</TEXTAREA>

<P><INPUT TYPE="button" VALUE="Store text"

onClick="btnClick();">

<INPUT TYPE="button" VALUE="Clear text"

onClick ="renoveCookie('MyText');TestForm.Conwent.value=' ' ">

<P><INPUT TYPE=submit VALUE="Send">

</FORM>

<SCRIPT LANGUACE="JavaScгipt">

<!--

var szMyText = "";

szMyText = findCookie("MyText");

if(szMyText != "")

{

TestForn.Comnert.value = szMyText;

}

//-->

</SCRIPT>

</BODY>

</HTML>

У ньому, у порівнянні з документом із поділу "Записна книжка Cook-ies Notepad", додана параметр ACTION в оператор <FORM>, а також кнопка типу submit із написом Send. За допомогою цієї кнопки дані з форми відправляються розширенню ISAPI:

...

<FORM NAME="TestForm" METHOD=POST

ACTION="http://frolov/scripts/ishello.dll?">

...

<INPUT TYPE=submit VALUE="Send">

Вихідний текст розширення ISAPI поданий у листинге 7.5. Він зроблений на базі приклада, узятого з 29-го тому "Бібліотеки системного програміста" (роздів "Додаток ISHELLO" гл. 8).

Листинг 7.5. Файл chapter7/NotebookISAPI/ishello. c

// Розширення ISAPI ishello.c

// Приклад розширення ISAPI, що відображає

// уміст cookie

//

// (С) Фролов А.В., 1997, 1998

// E-mail: frolov@glas.apc.org

// WWW: http://www.glasnet.ru/~frolov

// або

// http://www.dials.ccas.ru/frolov

#include <windows.h>

#include <httpext.h>

// Функція GetExtensionVersion

// Запис версії інтерфейсу ISAPI і

// рядки опису розширення

BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer)

{

// Записуємо версію інтерфейсу ISAPI

pVer->dwExtensioriVersion =

MAKELONG(HSE_VERSION_MINOR, HSE_VERSION_MAJOR);

// Записуємо рядок опису розширення

lstrcpyn(pVer->lpszExtensionDesc,

"Cookie show ISAPI DLL", HSE_MAX_EXT_DLL_NAMS_LEN);

return TRUE;

}

// Функція HttpExtensionProc

DWORD WINAPI HttpExtensionProc (EXTENSION_CONTROL_BLOCK *lpECB)

{

CHAR szBuff[4096];

CHAR szTempBuf[4096];

DWORD dwSize;

// Нульовий код стана - ознака успішного виконання

lpECB->dwHttpStatusCode = 0;

// Записуємо в буфер заголовок HTTP і початковий

// фрагмент формованого динамічно документа HTML

wsprintf(szBuff, "Content-Type: text/html\r\n\r\n"

"<HTML><HEAD><TITLE>Simple ISAPI

Extension</TITLE></HEAD>\n"

"<BODY BGCOLOR=#FFFFFF><H2>Hello from ISAPI

Extension!</H2>\n");

// Добавляємо розділювальну лінію strcat(szBuff, "<HR>");

// Добавляємо версію інтерфейсу ISAPI

wsprintf(szTempBuf, "<P>Extension Version: %d. %d",

HIWORD(lpECB->dwVersion), LOWORD(lpECB->dwVersion));

strcat (szBuff, szTempBuf);

// Назва методу передачі даних

wsprintf(szTempBuf, "<BR>Method: %s", lpECB->lpszMethod);

strcat(szBuff, szTempBuf);

// Рядок параметрів запуску розширення ISAPI

wsprintf(szTempBuf, "<BR>QueryString: %s", lpECB->lpszQueryString);

strcat(szBuff, szTempBuf);

// Фізичний шлях до програмного файла розширення ISAPI

wsprintf(szTempBuf, "<BR>PathTranslated: %s",

lpECB->lpszPathTranslated);

strcat(szBuff, szTempBuf);

// Повний розмір даних, що потрібно получить

wsprintf (szTempBuf, "<BR>TotalBytes: %d",

lpECB->cbTotalBytes);

strcat(szBuff, szTempBuf);

// Тип даних

wsprintf (szTempBuf, "<BR>ContentType: %s",

lpECB->lpszContentType);

strcat(szBuff, szTempBuf);

// Відображаємо вміст COOKIE

strcat(szBuff, "<HR><P><B>Cookie:</B><BR>");

dwSize = 4096;

lpECB->GetServerVariable(lpECB->ConnID,

(LPSTR)"HTTP_COOKIE", (LPVOID)szTempBuf, &dwSize);

strcat(szBuff, szTempBuf);

// Кінцевий фрагмент документа HTML

strcat (szBuff, "</BODY></HTML>");

// Посилаємо вміст буфера віддаленому користувачу

if(!lpECB->ServerSupportFunction(lpECB->ConnID,

HSE_REQ_SEND_RESPONSE_HEADER, NULL, NULL,

(LPDWORD)szBuff))

{

// Якщо послати дані не вдалося,

// завершуємо роботу нашого розширення ISAPI

// с кодом помилки

return HSE_STATUS_ERROR;

}

// Записуємо код успішного завершення

lpECB->dwHttpStatusCode = 200;

// Повертаємо ознаку успішного завершення

return HSE_STATUS_SUCCESS;

}

Файл визначення модуля для бібліотеки DLL розширення приведений у листинге 7.6.

Листинг 7.6. Файл chapter7/NotebookISAPI/ishelIo. def

LIBRARY ishello

DESCRIPTION 'Simple ISAPI DLL'

EXPORTS

GetExtensionVersion

HttpExtensionProc

Для витягу значення cookie, переданого розширенню через заголовки HTTP, використана функція GetSeiverVariable із указівкою їй у якості другого параметра імені цікавлячої перемінної НТТР_СООКIЕ:

lpECB->GetServerVariable (lpECB->ConnID,

(LPSTR)"HTTP_COOKIE", (LPVOID)szTempBuf, SdwSize);

Отримане в такий спосіб значення дописується в буфер динамічно утворюваного документа HTML. Цей буфер згодом буде відправлений клієнту за допомогою функції ServerSupportFunction.