C++ Web-Programmierung

Was ist CGI?

  • Das Common Gateway Interface (CGI) ist ein Standard, der definiert, wie Informationen zwischen Webservern und Client-Skripten ausgetauscht werden.
  • Die CGI-Spezifikation wird derzeit von NCSA gepflegt, das CGI wie folgt definiert:
  • Das Common Gateway Interface (CGI) ist ein Schnittstellenstandard, damit externe Gateway-Programme mit Informationsservern wie HTTP-Servern kommunizieren können.
  • Die aktuelle Version ist CGI/1.1, und CGI/1.2 wird entwickelt.

Web-Browsing

Um das Konzept von CGI besser zu verstehen, klicken wir auf einen Hyperlink, rufen eine bestimmte Webseite oder URL auf und sehen, was passiert.

  • Ihr Browser kontaktiert den HTTP-Webserver und fordert die URL an, das heißt den Dateinamen.
  • Der Webserver parst die URL und sucht nach dem Dateinamen. Wenn die angeforderte Datei gefunden wird, sendet der Webserver die Datei an den Browser zurück; andernfalls sendet er eine Fehlermeldung, die angibt, dass Sie eine falsche Datei angefordert haben.
  • Der Webbrowser empfängt die Antwort vom Webserver und zeigt die Datei oder Fehlermeldung basierend auf der empfangenen Antwort an.

Bei einem auf diese Weise aufgebauten HTTP-Server sendet der HTTP-Server jedoch, wann immer eine Datei in einem Verzeichnis angefordert wird, nicht die Datei selbst zurück, sondern führt sie als Programm aus und sendet die durch diese Ausführung erzeugte Ausgabe zur Anzeige an den Browser zurück.

Das Common Gateway Interface (CGI) ist ein Standardprotokoll, das Anwendungen (CGI-Programme oder CGI-Skripte genannt) ermöglicht, mit Webservern und Clients zu interagieren. Diese CGI-Programme können in Python, PERL, Shell, C oder C++ usw. geschrieben werden.

CGI-Architekturdiagramm

Das folgende Diagramm veranschaulicht die CGI-Architektur:

CGI 架构

Webserver-Konfiguration

Bevor Sie mit der CGI-Programmierung beginnen, stellen Sie sicher, dass Ihr Webserver CGI unterstützt und so konfiguriert wurde, dass er CGI-Programme verarbeiten kann. Alle vom HTTP-Server ausgeführten CGI-Programme müssen in einem vorkonfigurierten Verzeichnis abgelegt werden. Dieses Verzeichnis wird CGI-Verzeichnis genannt und heißt üblicherweise /var/www/cgi-bin. Obwohl CGI-Dateien C++-Executables sind, ist ihre Dateiendung üblicherweise.cgi。

Standardmäßig ist der Apache-Webserver so konfiguriert, dass er CGI-Programme in /var/www/cgi-bin ausführt. Wenn Sie ein anderes Verzeichnis für die Ausführung von CGI-Skripten angeben möchten, können Sie den folgenden Abschnitt in der Datei httpd.conf ändern:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>
 
<Directory "/var/www/cgi-bin">
Options All
</Directory>

Hier gehen wir davon aus, dass der Webserver konfiguriert wurde und erfolgreich läuft, und dass Sie jedes CGI-Programm ausführen können, wie z. B. Perl oder Shell usw.

Erstes CGI-Programm

Bitte sehen Sie sich das folgende C++-Programm an:

Beispiel

#include <iostream> using namespace std; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Hallo Welt - Erstes CGI-Programm</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<h2>Hallo Welt! Dies ist mein erstes CGI-Programm</h2>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Kompilieren Sie den obigen Code, benennen Sie die ausführbare Datei cplusplus.cgi und speichern Sie diese Datei im Verzeichnis /var/www/cgi-bin. Bevor Sie das CGI-Programm ausführen, verwenden Sie bittechmod 755 cplusplus.cgiVerwenden Sie einen UNIX-Befehl, um den Dateimodus zu ändern und sicherzustellen, dass die Datei ausführbar ist. Greifen Sie auf die ausführbare Datei zu, und Sie sehen die folgende Ausgabe:

Hallo Welt! Dies ist mein erstes CGI-Programm

Das obige C++-Programm ist ein einfaches Programm, das seine Ausgabe in die STDOUT-Datei schreibt, das heißt, sie auf dem Bildschirm anzeigt. Hier ist es erwähnenswert, dass die erste Zeile der AusgabeContent-type:text/html\r\n\r\nan den Browser zurückgesendet wird und den Inhaltstyp angibt, der im Browserfenster angezeigt werden soll. Sie müssen die grundlegenden Konzepte von CGI verstehen, um Python weiterhin zum Schreiben komplexerer CGI-Programme zu verwenden. C++-CGI-Programme können mit jedem anderen externen System (wie z. B. RDBMS) interagieren.

HTTP-Header-Informationen

ZeileContent-type:text/html\r\n\r\nSie ist Teil der HTTP-Header-Informationen, die an den Browser gesendet werden, damit dieser den Seiteninhalt besser versteht. Die HTTP-Header-Informationen haben das folgende Format:

HTTP 字段名称: 字段内容
 
例如
Content-type: text/html\r\n\r\n

Es gibt auch einige andere wichtige HTTP-Header, die in Ihrer CGI-Programmierung häufig verwendet werden.

Header-Informationen Beschreibung
Content-type: MIME-String, definiert das Format der zurückgegebenen Datei. Zum Beispiel Content-type:text/html.
Expires: Datum Das Datum, an dem die Information ungültig wird. Der Browser verwendet es, um zu bestimmen, wann eine Seite aktualisiert werden muss. Eine gültige Datumszeichenfolge sollte das Format 01 Jan 1998 12:00:00 GMT haben.
Location: URL Diese URL bezieht sich auf die URL, die zurückgegeben werden soll, nicht auf die angeforderte URL. Sie können damit eine Anforderung auf eine beliebige Datei umleiten.
Last-modified: Datum Das Datum der letzten Änderung der Ressource.
Content-length: N Die Länge der zurückzugebenden Daten in Bytes. Der Browser verwendet diesen Wert, um die geschätzte Downloadzeit für eine Datei anzugeben.
Set-Cookie: String DurchstringCookie setzen.

CGI-Umgebungsvariablen

Alle CGI-Programme können auf die folgenden Umgebungsvariablen zugreifen. Diese Variablen spielen eine sehr wichtige Rolle beim Schreiben von CGI-Programmen.

Variablenname Beschreibung
CONTENT_TYPE Der Datentyp des Inhalts. Wird verwendet, wenn der Client zusätzliche Inhalte an den Server sendet. Zum Beispiel Funktionen wie Dateiupload.
CONTENT_LENGTH Die Länge der Abfrageinformationen. Nur bei POST-Anfragen verfügbar.
HTTP_COOKIE Gibt die gesetzten Cookies in Form von Schlüssel-Wert-Paaren zurück.
HTTP_USER_AGENT Das User-Agent-Request-Header-Feld liefert Informationen über die Anfrage des Benutzers, einschließlich Browsername, Version und anderer plattformspezifischer Zusatzinformationen.
PATH_INFO Der Pfad des CGI-Skripts.
QUERY_STRING Die URL-kodierten Informationen beim Senden einer Anfrage über die GET-Methode, die die Parameter nach dem Fragezeichen in der URL enthalten.
REMOTE_ADDR Die IP-Adresse des entfernten Hosts, der die Anfrage stellt. Dies ist sehr nützlich für Protokollierung und Authentifizierung.
REMOTE_HOST Der voll qualifizierte Name des Hosts, der die Anfrage stellt. Wenn diese Information nicht verfügbar ist, kann REMOTE_ADDR verwendet werden, um die IP-Adresse zu erhalten.
REQUEST_METHOD Die Methode, mit der die Anfrage gestellt wird. Die gebräuchlichsten Methoden sind GET und POST.
SCRIPT_FILENAME Der vollständige Pfad des CGI-Skripts.
SCRIPT_NAME Der Name des CGI-Skripts.
SERVER_NAME Der Hostname oder die IP-Adresse des Servers.
SERVER_SOFTWARE Der Name und die Version der Software, die auf dem Server läuft.

Das folgende CGI-Programm listet alle CGI-Variablen auf.

Beispiel

#include <iostream> #include <stdlib.h> #include <string> using namespace std; const string ENV[ 24 ] = { "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT", "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL", "SERVER_SIGNATURE","SERVER_SOFTWARE" }; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>CGI-Umgebungsvariablen</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; for ( int i = 0; i < 24; i++ ) { cout << "<tr><td>" << ENV[ i ] << "</td><td>"; // Versuchen Sie, den Wert der Umgebungsvariable abzurufen char *value = getenv( ENV[ i ].c_str() ); if ( value != 0 ){ cout << value; }else{ cout << "Die Umgebungsvariable existiert nicht."; } cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

C++-CGI-Bibliothek

In realen Beispielen müssen Sie viele Operationen über das CGI-Programm ausführen. Hier ist eine CGI-Bibliothek, die speziell für C++-Programme geschrieben wurde und die wir vonftp://ftp.gnu.org/gnu/cgicc/ beziehen können.Laden Sie diese CGI-Bibliothek herunter und installieren Sie die Bibliothek gemäß den folgenden Schritten:

$ tar xzf cgicc-X.X.X.tar.gz 
$ cd cgicc-X.X.X/ 
$ ./configure --prefix=/usr 
$ make
$ make install

Hinweis:Die Bibliotheken libcgicc.so und libcgicc.a werden in das Verzeichnis /usr/lib installiert; führen Sie den Kopierbefehl aus:

$ sudo cp /usr/lib/libcgicc.* /usr/lib64/

Damit CGI-Programme die dynamische Linkbibliothek libcgicc.so automatisch finden können.

Sie können aufC++ CGI Lib-Dokumentationklicken, um die entsprechende Bibliotheksdokumentation einzusehen.

GET- und POST-Methoden

Sie sind möglicherweise auf Situationen gestoßen, in denen Sie einige Informationen vom Browser an den Webserver und dann an das CGI-Programm übergeben müssen. Normalerweise verwendet der Browser zwei Methoden, um diese Informationen an den Webserver zu übergeben: GET und POST.

Übergeben von Informationen mit der GET-Methode

Die GET-Methode hängt die codierten Benutzerinformationen an die Seitenanforderung an. Die Seite und die codierten Informationen werden durch das Zeichen ? getrennt, wie folgt:

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

Die GET-Methode ist die Standardmethode zum Übergeben von Informationen vom Browser an den Webserver. Sie erzeugt eine lange Zeichenkette in der Adressleiste des Browsers. Wenn Sie Passwörter oder andere vertrauliche Informationen an den Server übergeben, verwenden Sie nicht die GET-Methode. Die GET-Methode hat eine Größenbeschränkung; in einer Anforderungszeichenfolge sind maximal 1024 Zeichen zulässig.

Bei Verwendung der GET-Methode werden Informationen über den HTTP-Header QUERY_STRING übergeben, auf den in CGI-Programmen über die Umgebungsvariable QUERY_STRING zugegriffen werden kann.

Sie können Informationen übergeben, indem Sie einfache verkettete Schlüssel-Wert-Paare an die URL anhängen oder indem Sie die GET-Methode des HTML-Tags <FORM> verwenden.

Einfaches URL-Beispiel: GET-Methode

Das folgende Beispiel übergibt zwei Werte mit der GET-Methode an das Programm cpp_get.cgi.

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Das folgende Beispiel generiertcpp_get.cgiDas CGI-Programm wird verwendet, um Eingaben vom Webbrowser zu verarbeiten. Durch die Verwendung der C++-CGI-Bibliothek kann auf die übergebenen Informationen leicht zugegriffen werden:

Beispiel

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Verwendung von GET- und POST-Methoden</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("first_name"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Vorname:" << **fi << endl; }else{ cout << "Kein Text für den Vornamen eingegeben" << endl; } cout << "<br/>\n"; fi = formData.getElement("last_name"); if( !fi->isEmpty() &&fi != (*formData).end()) { cout << "Nachname:" << **fi << endl; }else{ cout << "Kein Text für den Nachnamen eingegeben" << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Kompilieren Sie nun das obige Programm wie folgt:

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

Generieren Sie cpp_get.cgi, platzieren Sie es im CGI-Verzeichnis und versuchen Sie, darauf mit dem folgenden Link zuzugreifen:

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Dies ergibt das folgende Ergebnis:

名:ZARA 
姓:ALI 

Einfaches Formularbeispiel: GET-Methode

Das Folgende ist ein einfaches Beispiel, das ein HTML-Formular und einen Submit-Button verwendet, um zwei Werte zu übergeben. Wir werden dasselbe CGI-Skript cpp_get.cgi verwenden, um die Eingabe zu verarbeiten.

<form action="/cgi-bin/cpp_get.cgi" method="get">Vorname:<input type="text" name="first_name"> <br />Nachname:<input type="text" name="last_name" /> <input type="submit" value="Absenden" /> </Form>

Das Folgende ist die tatsächliche Ausgabe des obigen Formulars. Bitte geben Sie Ihren Vornamen und Nachnamen ein und klicken Sie dann auf die Schaltfläche „Absenden“, um das Ergebnis zu sehen.

Übergeben von Informationen mit der POST-Methode

Eine zuverlässigere Methode zum Übergeben von Informationen an CGI-Programme ist die POST-Methode. Diese Methode verpackt Informationen auf die gleiche Weise wie die GET-Methode, außer dass sie die Informationen nicht als Textzeichenfolge nach dem ? in der URL übergibt, sondern als separate Nachricht. Die Nachricht wird als Standardeingabe an das CGI-Skript übergeben.

Wir verwenden auch das Programm cpp_get.cgi, um die POST-Methode zu verarbeiten. Verwenden wir dasselbe Beispiel und übergeben zwei Werte mit einem HTML-Formular und einer Schaltfläche „Absenden“, außer dass wir diesmal die POST-Methode anstelle der GET-Methode verwenden, wie folgt:

<form action="/cgi-bin/cpp_get.cgi" method="post">Vorname:<input type="text" name="first_name"><br />Nachname:<input type="text" name="last_name" /> <input type="submit" value="Absenden" /> </Form>

Übergeben von Checkbox-Daten an CGI-Programme

Wenn mehrere Optionen ausgewählt werden müssen, verwenden wir Checkboxen.

Das folgende HTML-Codebeispiel ist ein Formular mit zwei Kontrollkästchen:

<form action="/cgi-bin/cpp_checkbox.cgi" method="POST" target="_blank"> <input type="checkbox" name="maths" value="on" />Mathematik<input type="checkbox" name="physics" value="on" />Physik<input type="submit" value="Fach auswählen" /> </Form>

Das folgende C++-Programm generiert das Skript cpp_checkbox.cgi, das die vom Webbrowser über Kontrollkästchen übermittelten Eingaben verarbeitet.

Beispiel

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; bool maths_flag, physics_flag; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Übergeben von Kontrollkästchen-Daten an ein CGI-Programm</title>\n"; cout << "</head>\n"; cout << "<body>\n"; maths_flag = formData.queryCheckbox("maths"); if( maths_flag ) { cout << "Mathe-Flag: AN " << endl; }else{ cout << "Mathe-Flag: AUS " << endl; } cout << "<br/>\n"; physics_flag = formData.queryCheckbox("physics"); if( physics_flag ) { cout << "Physik-Flag: AN " << endl; }else{ cout << "Physik-Flag: AUS " << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Übergeben von Radiobutton-Daten an CGI-Programme

Wenn nur eine Option ausgewählt werden muss, verwenden wir Radiobuttons.

Das folgende HTML-Codebeispiel ist ein Formular mit zwei Radio-Buttons:

<form action="/cgi-bin/cpp_radiobutton.cgi" method="post" target="_blank"> <input type="radio" name="subject" value="maths" checked="checked"/>Mathematik<input type="radio" name="subject" value="physics" />Physik<input type="submit" value="Fach auswählen" /> </form>

Das folgende C++-Programm generiert das Skript cpp_radiobutton.cgi, das die vom Webbrowser über Radio-Buttons übermittelten Eingaben verarbeitet.

Beispiel

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Übergeben von Radio-Button-Daten an ein CGI-Programm</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("subject"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Radiobox ausgewählt: " << **fi << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Übergeben von Textarea-Daten an CGI-Programme

Wenn mehrzeiliger Text an ein CGI-Programm übergeben werden muss, verwenden wir das TEXTAREA-Element.

Das folgende HTML-Codebeispiel ist ein Formular mit einem TEXTAREA-Feld:

<form action="/cgi-bin/cpp_textarea.cgi" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4">Bitte Text hier eingeben...</textarea> <input type="submit" value="Absenden" /> </Form>

Das folgende C++-Programm erzeugt das Skript cpp_textarea.cgi, das Eingaben verarbeitet, die vom Webbrowser über eine Textarea übergeben werden.

Beispiel

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Übergeben von Textarea-Daten an ein CGI-Programm</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("textcontent"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Textinhalt: " << **fi << endl; }else{ cout << "Kein Text eingegeben" << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Übergeben von Dropdown-Box-Daten an CGI-Programme

Wenn mehrere Optionen verfügbar sind, aber nur eine oder zwei Optionen ausgewählt werden können, verwenden wir ein Dropdown-Feld.

Das folgende HTML-Codebeispiel ist ein Formular mit einem Dropdown-Feld:

<form action="/cgi-bin/cpp_dropdown.cgi" method="post" target="_blank"> <select name="dropdown"> <option value="Maths" selected>Mathematik</option> <option value="Physics">Physik</option> </select> <input type="submit" value="Absenden"/> </Form>

Das folgende C++-Programm erzeugt das Skript cpp_dropdown.cgi, das die vom Webbrowser über ein Dropdown-Feld eingegebenen Daten verarbeitet.

Beispiel

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc formData; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Übergeben von Dropdown-Box-Daten an CGI-Programm</title>\n"; cout << "</head>\n"; cout << "<body>\n"; form_iterator fi = formData.getElement("dropdown"); if( !fi->isEmpty() && fi != (*formData).end()) { cout << "Ausgewählter Wert: " << **fi << endl; } cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Verwendung von Cookies in CGI

Das HTTP-Protokoll ist ein zustandsloses Protokoll. Aber für eine kommerzielle Website müssen Sitzungsinformationen zwischen verschiedenen Seiten beibehalten werden. Beispielsweise schließt ein Benutzer die Registrierung ab, nachdem er Schritte über mehrere Seiten hinweg ausgeführt hat. Wie können jedoch die Sitzungsinformationen des Benutzers über alle Webseiten hinweg beibehalten werden?

In vielen Fällen ist die Verwendung von Cookies die effektivste Möglichkeit, Informationen über Benutzerpräferenzen, Käufe, Provisionen und andere Informationen zu speichern und zu verfolgen, die für ein besseres Besuchererlebnis oder Website-Statistiken benötigt werden.

Funktionsweise

Der Server sendet einige Daten in Form eines Cookies an den Browser des Besuchers. Wenn der Browser das Cookie akzeptiert, wird es als Klartext-Datensatz auf der Festplatte des Besuchers gespeichert. Wenn der Besucher nun eine andere Seite der Website besucht, wird das Cookie abgerufen. Sobald das Cookie gefunden wurde, weiß der Server, was gespeichert wurde.

Ein Cookie ist ein Klartext-Datensatz mit 5 Feldern variabler Länge:

  • Expires :Das Ablaufdatum des Cookies. Wenn dieses Feld leer bleibt, läuft das Cookie ab, wenn der Besucher den Browser verlässt.
  • Domain :Der Domainname der Website.
  • Path :Das Verzeichnis oder der Seitenpfad, in dem das Cookie gesetzt wird. Wenn Sie das Cookie von jedem Verzeichnis oder jeder Seite abrufen möchten, kann dieses Feld leer gelassen werden.
  • Secure :Wenn dieses Feld das Wort "secure" enthält, kann das Cookie nur über einen sicheren Server abgerufen werden. Wenn dieses Feld leer bleibt, besteht diese Einschränkung nicht.
  • Name=Value :Cookies werden in Form von Schlüssel-Wert-Paaren gesetzt und abgerufen.

Cookies setzen

Das Senden von Cookies an den Browser ist sehr einfach. Diese Cookies werden zusammen mit den HTTP-Headern gesendet, vor dem Content-type-Feld. Angenommen, Sie möchten UserID und Password als Cookies setzen. Die Schritte zum Setzen von Cookies sind wie folgt:

Beispiel

#include <iostream> using namespace std; int main () { cout << "Set-Cookie:UserID=XYZ;\r\n"; cout << "Set-Cookie:Password=XYZ123;\r\n"; cout << "Set-Cookie:Domain=www.w3cschool.cc;\r\n"; cout << "Set-Cookie:Path=/perl;\n"; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Cookies in CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "Cookies setzen" << endl; cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Aus diesem Beispiel haben wir gelernt, wie man Cookies setzt. Wir verwendenSet-CookieHTTP-Header, um Cookies zu setzen.

Hier sind einige Attribute zum Setzen von Cookies optional, wie Expires, Domain und Path. Es ist erwähnenswert, dass Cookies in der Sendzeile"Content-type:text/html\r\n\r\nEs wurde zuvor festgelegt.

Kompilieren Sie das obige Programm, um setcookies.cgi zu erzeugen, und versuchen Sie, den folgenden Link zu verwenden, um Cookies zu setzen. Es wird vier Cookies auf Ihrem Computer setzen:

/cgi-bin/setcookies.cgi

Cookies abrufen

Das Abrufen aller gesetzten Cookies ist sehr einfach. Die Cookies werden in der CGI-Umgebungsvariable HTTP_COOKIE gespeichert, und ihr Format ist wie folgt:

key1=value1;key2=value2;key3=value3....

Das folgende Beispiel zeigt, wie Cookies abgerufen werden.

Beispiel

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc cgi; const_cookie_iterator cci; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Cookies in CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; // Umgebungsvariablen abrufen const CgiEnvironment& env = cgi.getEnvironment(); for( cci = env.getCookieList().begin(); cci != env.getCookieList().end(); ++cci ) { cout << "<tr><td>" << cci->getName() << "</td><td>"; cout << cci->getValue(); cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "<br/>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Kompilieren Sie nun das obige Programm, um getcookies.cgi zu erzeugen, und versuchen Sie, den folgenden Link zu verwenden, um alle verfügbaren Cookies auf Ihrem Computer abzurufen:

/cgi-bin/getcookies.cgi

Dies erzeugt eine Liste, die die vier im vorherigen Abschnitt gesetzten Cookies sowie alle anderen Cookies auf Ihrem Computer anzeigt:

UserID XYZ 
Password XYZ123 
Domain www.w3cschool.cc 
Path /perl 

Beispiel für Datei-Upload

Um eine Datei hochzuladen, muss das HTML-Formular das enctype-Attribut aufmultipart/form-datasetzen. Das input-Tag mit dem Dateityp erstellt eine Schaltfläche "Durchsuchen".

<html> <body> <form enctype="multipart/form-data" action="/cgi-bin/cpp_uploadfile.cgi" method="post"> <p>Datei:<input type="file" name="userfile" /></p> <p><input type="submit" value="Hochladen" /></p> </form> </body> </html>

Das Ergebnis dieses Codes ist das folgende Formular:

Datei:

Hinweis:Das obige Beispiel hat das Speichern der hochgeladenen Datei auf unserem Server absichtlich deaktiviert. Sie können den obigen Code auf Ihrem eigenen Server ausprobieren.

Das Folgende ist ein Skript zur Verarbeitung von Datei-Uploads.cpp_uploadfile.cpp:

Beispiel

#include <iostream> #include <vector> #include <string> #include <stdio.h> #include <stdlib.h> #include <cgicc/CgiDefs.h> #include <cgicc/Cgicc.h> #include <cgicc/HTTPHTMLHeader.h> #include <cgicc/HTMLClasses.h> using namespace std; using namespace cgicc; int main () { Cgicc cgi; cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Datei-Upload in CGI</title>\n"; cout << "</head>\n"; cout << "<body>\n"; // Liste der hochzuladenden Dateien abrufen const_file_iterator file = cgi.getFile("userfile"); if(file != cgi.getFiles().end()) { // Datentyp in cout senden cout << HTTPContentHeader(file->getDataType()); // Inhalt in cout schreiben file->writeToStream(cout); } cout << "<Datei erfolgreich hochgeladen>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }

Das obige Beispiel ist incoutInhalt in den Stream schreiben, aber Sie können einen Dateistream öffnen und den Inhalt der hochgeladenen Datei in einer bestimmten Datei am Zielort speichern.

Weitere Erweiterungen