C++ 웹 프로그래밍


CGI란 무엇인가요?

  • 공통 게이트웨이 인터페이스(CGI)는 웹 서버와 클라이언트 스크립트 간에 정보가 교환되는 방식을 정의하는 표준 집합입니다.

  • CGI 사양은 현재 NCSA에서 관리하고 있으며 NCSA에서는 CGI를 다음과 같이 정의합니다.

  • Common Gateway Interface(CGI)는 외부 게이트웨이 프로그램을 정보 서버(예: HTTP 서버)에 연결하기 위한 인터페이스 표준입니다.

  • 현재 버전은 CGI/1.1이고, CGI/1.2 버전이 진행중입니다.

웹 검색

CGI의 개념을 더 잘 이해하려면 하이퍼링크를 클릭하고 특정 웹 페이지나 URL을 탐색하여 어떤 일이 일어나는지 살펴보겠습니다.

  • 브라우저가 HTTP 웹 서버에 접속하여 파일 이름인 URL을 요청합니다.

  • 웹 서버는 URL을 구문 분석하고 파일 이름을 찾습니다. 요청한 파일이 발견되면 웹 서버는 해당 파일을 브라우저로 다시 보내고, 그렇지 않으면 잘못된 파일을 요청했다는 오류 메시지를 보냅니다.

  • 웹 브라우저는 웹 서버로부터 응답을 받고 받은 응답에 따라 파일이나 오류 메시지를 표시합니다.

이렇게 구축된 HTTP 서버는 디렉토리에 있는 파일이 요청될 때마다 해당 파일을 다시 보내지 않고 프로그램 형식으로 실행하여 생성된 출력을 보냅니다. 실행. 브라우저에 다시 표시됩니다.

Common Gateway Interface(CGI)는 애플리케이션(CGI 프로그램 또는 CGI 스크립트라고 함)이 웹 서버 및 클라이언트와 상호 작용할 수 있도록 하는 표준 프로토콜입니다. 이러한 CGI 프로그램은 Python, PERL, Shell, C 또는 C++ 등으로 작성될 수 있습니다.

CGI 아키텍처 다이어그램

다음 그림은 CGI의 아키텍처를 보여줍니다.

cgiarch.gif

웹 서버 구성

CGI 프로그래밍을 수행하기 전에 웹 서버가 CGI를 지원하고 CGI 프로그램을 처리하도록 구성되었는지 확인하세요. HTTP 서버에서 실행되는 모든 CGI 프로그램은 미리 구성된 디렉터리에 있어야 합니다. 이 디렉토리는 CGI 디렉토리라고 하며 일반적으로 /var/www/cgi-bin으로 이름이 지정됩니다. CGI 파일은 C++ 실행 파일이지만 일반적으로 확장자는 .cgi입니다.

기본적으로 Apache 웹 서버는 /var/www/cgi-bin에서 CGI 프로그램을 실행하도록 구성되어 있습니다. CGI 스크립트를 실행하기 위해 다른 디렉터리를 지정하려면 httpd.conf 파일에서 다음 섹션을 수정할 수 있습니다.

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

여기서는 웹 서버가 구성되어 성공적으로 실행될 수 있다고 가정하고 모든 CGI 프로그램을 실행할 수 있습니다. , Perl이나 Shell 등과 같은

첫 번째 CGI 프로그램

다음 C++ 프로그램을 참조하세요.

#include <iostream>
using namespace std;
 
int main ()
{
    
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Hello World - 第一个 CGI 程序</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<h2>Hello World! 这是我的第一个 CGI 程序</h2>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

위 코드를 컴파일하고 실행 파일 이름을 cplusplus.cgi로 지정한 후 이 파일을 /var/www/cgi-bin 디렉터리에 저장하세요. CGI 프로그램을 실행하기 전에 chmod 755 cplusplus.cgi UNIX 명령을 사용하여 파일이 실행 가능하도록 파일 모드를 수정하세요. 실행 파일에 액세스하면 다음 출력이 표시됩니다.

Hello World! 이것은 나의 첫 번째 CGI 프로그램입니다.

위의 C++ 프로그램은 출력을 STDOUT 파일, 즉 화면에 표시하는 간단한 프로그램입니다. 여기서 첫 번째 줄은 Content-type: text/htmlrnrn을 출력한다는 점에 주목할 가치가 있습니다. 이 줄은 브라우저로 다시 전송되며 브라우저 창에 표시될 콘텐츠 유형을 지정합니다. Python을 사용하여 보다 복잡한 CGI 프로그램을 작성하려면 CGI의 기본 개념을 이해해야 합니다. C++ CGI 프로그램은 다른 외부 시스템(예: RDBMS)과 상호 작용할 수 있습니다.

HTTP 헤더

Line Content-type:text/htmlrnrn은 페이지 콘텐츠를 더 잘 이해하기 위해 브라우저로 전송되는 HTTP 헤더의 일부입니다. HTTP 헤더 정보의 형식은 다음과 같습니다.

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

CGI 프로그래밍에서 자주 사용되는 다른 중요한 HTTP 헤더 정보도 있습니다.

헤더 정보Description
Content-type:MIME 문자열, 반환된 파일 형식을 정의합니다. 예를 들어 콘텐츠 유형:텍스트/html입니다.
만료: 날짜 정보가 유효하지 않은 날짜가 됩니다. 브라우저는 이를 사용하여 페이지를 새로 고쳐야 하는 시기를 결정합니다. 유효한 날짜 문자열은 1998년 1월 1일 12:00:00 GMT 형식이어야 합니다.
위치: URL이 URL은 요청된 URL이 아니라 반환되어야 하는 URL을 나타냅니다. 이를 사용하여 요청을 임의의 파일로 리디렉션할 수 있습니다.
Last-modified: Date리소스의 마지막 수정 날짜입니다.
Content-length: N반환될 데이터의 길이(바이트)입니다. 브라우저는 이 값을 사용하여 파일의 예상 다운로드 시간을 나타냅니다.
Set-Cookie: String string을 통해 쿠키를 설정합니다.

CGI 환경 변수

모든 CGI 프로그램은 다음 환경 변수에 액세스할 수 있습니다. 이러한 변수는 CGI 프로그램을 작성할 때 매우 중요한 역할을 합니다.

변수 이름설명
CONTENT_TYPE콘텐츠의 데이터 유형입니다. 클라이언트가 서버에 추가 콘텐츠를 보낼 때 사용됩니다. 예를 들어 파일 업로드 및 기타 기능이 있습니다.
CONTENT_LENGTH쿼리 정보의 길이입니다. POST 요청에만 사용할 수 있습니다.
HTTP_COOKIE세트 쿠키를 키 및 값 쌍으로 반환합니다.
HTTP_USER_AGENT사용자 에이전트 요청 헤더 필드는 브라우저 이름, 버전 및 기타 플랫폼별 추가 정보를 포함하여 사용자가 시작한 요청에 대한 정보를 제출합니다.
PATH_INFOCGI 스크립트의 경로입니다.
QUERY_STRINGURL에서 물음표 뒤의 매개변수를 포함하여 GET 메서드를 통해 요청을 보낼 때의 URL 인코딩 정보입니다.
REMOTE_ADDR요청하는 원격 호스트의 IP 주소입니다. 이는 로깅 및 인증 목적에 매우 유용합니다.
REMOTE_HOST요청하는 호스트의 정규화된 이름입니다. 이 정보를 사용할 수 없는 경우 REMOTE_ADDR을 사용하여 IP 주소를 얻을 수 있습니다.
REQUEST_METHOD요청에 사용된 방법입니다. 가장 일반적인 방법은 GET 및 POST입니다.
SCRIPT_FILENAMECGI 스크립트의 전체 경로입니다.
SCRIPT_NAMECGI 스크립트의 이름입니다.
SERVER_NAME서버의 호스트 이름 또는 IP 주소입니다.
SERVER_SOFTWARE서버에서 실행 중인 소프트웨어의 이름과 버전입니다.

다음 CGI 프로그램은 모든 CGI 변수를 나열합니다.

#include <iostream>
#include <stdlib.h>
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 环境变量</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>";
       // 尝试检索环境变量的值
       char *value = getenv( ENV[ i ].c_str() );  
       if ( value != 0 ){
         cout << value;                                 
       }else{
         cout << "环境变量不存在。";
       }
       cout << "</td></tr>\n";
   }
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

C++ CGI Library

실제 환경에서는 CGI 프로그램을 통해 많은 작업을 수행해야 합니다. C++ 프로그램용으로 특별히 작성된 CGI 라이브러리가 있습니다. ftp://ftp.gnu.org/gnu/cgicc/에서 이 CGI 라이브러리를 다운로드하고 아래 단계에 따라 라이브러리를 설치할 수 있습니다.

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

C++ CGI를 클릭할 수 있습니다. Lib 문서, 관련 라이브러리 문서를 확인하세요.

GET 및 POST 방법

브라우저에서 웹 서버로, 마지막으로 CGI 프로그램으로 일부 정보를 전달해야 하는 상황에 직면했을 수 있습니다. 일반적으로 브라우저는 이 정보를 웹 서버에 전송하기 위해 GET 및 POST 방법이라는 두 가지 방법을 사용합니다.

GET 메서드를 사용하여 정보 전달

GET 메서드는 페이지 요청에 추가된 인코딩된 사용자 정보를 보냅니다. 페이지와 인코딩된 정보는 아래와 같이 ? 문자로 구분됩니다.

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

GET 방법은 브라우저에서 웹 서버로 정보를 전송하는 기본 방법으로 브라우저 주소에 긴 정보 문자열을 생성합니다. 바.문자열. 비밀번호나 기타 민감한 정보를 서버에 전달할 때는 GET 메서드를 사용하지 마세요. GET 메서드에는 크기 제한이 있으며 요청 문자열에 최대 1024자까지 전달할 수 있습니다.

GET 메소드를 사용할 때 QUERY_STRING http 헤더는 CGI 프로그램에서 QUERY_STRING 환경 변수를 사용하여 액세스할 수 있는 정보를 전송하는 데 사용됩니다.

간단히 연결된 키-값 쌍이 있는 URL을 따르거나 HTML <FORM> 태그의 GET 메소드를 사용하여 정보를 전달할 수 있습니다.

간단한 URL 예시: Get 메소드

다음은 GET 메소드를 사용하여 hello_get.py 프로그램에 두 개의 값을 전달하는 단순 URL입니다.

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

다음 예에서는 웹 브라우저에서 제공하는 입력을 처리하는 CGI 프로그램을 cpp_get.cgi 생성합니다. 전달된 정보는 C++ CGI 라이브러리를 사용하여 쉽게 액세스할 수 있습니다.

#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>使用 GET 和 POST 方法</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "名:" << **fi << endl;  
   }else{
      cout << "No text entered for first name" << endl;  
   }
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "姓:" << **fi << endl;  
   }else{
      cout << "No text entered for last name" << endl;  
   }
   cout << "<br/>\n";

   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

이제 위 프로그램을 다음과 같이 컴파일합니다.

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

cpp_get.cgi를 생성하여 CGI 디렉터리에 넣고 다음 링크에 액세스해 보세요.

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

다음 결과가 생성됩니다.

名:ZARA 
姓:ALI

간단한 양식 예: GET 메소드

다음은 HTML 양식을 사용하는 간단한 예이며 제출 버튼은 두 개의 값을 전달합니다. 입력을 처리하기 위해 동일한 CGI 스크립트 cpp_get.cgi를 사용할 것입니다.

<form action="/cgi-bin/cpp_get.cgi" method="get">
名:<input type="text" name="first_name">  <br />
 
姓:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>

아래는 위 양식의 실제 출력입니다. 이름과 성을 입력하고 제출 버튼을 클릭하여 결과를 확인하세요.

POST 메서드를 사용하여 정보 전달

CGI 프로그램에 정보를 전달하는 보다 안정적인 방법은 POST 메서드입니다. 이 메소드는 정보를 URL의 ? 뒤에 텍스트 문자열로 전달하는 대신 별도의 메시지로 전달한다는 점을 제외하면 GET 메소드와 동일한 방식으로 정보를 패키징합니다. 이 메시지는 표준 입력으로 CGI 스크립트에 전달됩니다.

POST 메소드를 처리하기 위해 cpp_get.cgi 프로그램도 사용합니다. 동일한 예를 들어 HTML 양식과 제출 버튼을 사용하여 두 개의 값을 전달하겠습니다. 이번에는 GET 메서드 대신 아래와 같이 POST 메서드를 사용합니다.

<form action="/cgi-bin/cpp_get.cgi" method="post">
名:<input type="text" name="first_name"><br />
姓:<input type="text" name="last_name" />
 
<input type="submit" value="提交" />
</form>

CGI 프로그램 데이터에 체크박스 전달

다음 경우에 체크박스를 사용합니다. 여러 옵션을 선택해야 합니다.

다음 HTML 코드 예제는 두 개의 체크박스가 있는 양식입니다.

<form action="/cgi-bin/cpp_checkbox.cgi" 
         method="POST" 
         target="_blank">
<input type="checkbox" name="maths" value="on" /> 数学
<input type="checkbox" name="physics" value="on" /> 物理
<input type="submit" value="选择学科" />
</form>

다음 C++ 프로그램은 체크박스를 통해 웹 브라우저에서 제공하는 입력을 처리하는 cpp_checkbox.cgi 스크립트를 생성합니다.

#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>向 CGI 程序传递复选框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   maths_flag = formData.queryCheckbox("maths");
   if( maths_flag ) {  
      cout << "Maths Flag: ON " << endl;  
   }else{
      cout << "Maths Flag: OFF " << endl;  
   }
   cout << "<br/>\n";

   physics_flag = formData.queryCheckbox("physics");
   if( physics_flag ) {  
      cout << "Physics Flag: ON " << endl;  
   }else{
      cout << "Physics Flag: OFF " << endl;  
   }
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

라디오 버튼 데이터를 CGI 프로그램에 전달

우리는 하나의 옵션만 선택해야 할 때 라디오 버튼을 사용합니다.

다음 HTML 코드 예제는 두 개의 라디오 버튼이 있는 양식입니다.

<form action="/cgi-bin/cpp_radiobutton.cgi" 
         method="post" 
         target="_blank">
<input type="radio" name="subject" value="maths" 
                                    checked="checked"/> 数学 
<input type="radio" name="subject" value="physics" /> 物理
<input type="submit" value="选择学科" />
</form>

다음 C++ 프로그램은 라디오 버튼을 통해 웹 브라우저에서 제공하는 입력을 처리하는 cpp_radiobutton.cgi 스크립트를 생성합니다.

#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>向 CGI 程序传递单选按钮数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("subject");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Radio box selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

텍스트 영역 데이터를 CGI 프로그램에 전달

CGI 프로그램에 여러 줄의 텍스트를 전달해야 할 때 TEXTAREA 요소를 사용합니다.

다음 HTML 코드 예제는 TEXTAREA 상자가 있는 양식입니다.

<form action="/cgi-bin/cpp_textarea.cgi" 
         method="post" 
         target="_blank">
<textarea name="textcontent" cols="40" rows="4">
请在这里输入文本...
</textarea>
<input type="submit" value="提交" />
</form>

다음 C++ 프로그램은 텍스트 영역을 통해 웹 브라우저에서 제공하는 입력을 처리하는 cpp_textarea.cgi 스크립트를 생성합니다.

#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>向 CGI 程序传递文本区域数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("textcontent");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Text Content: " << **fi << endl;  
   }else{
      cout << "No text entered" << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

CGI 프로그램에 드롭다운 상자 데이터 전달

여러 옵션을 사용할 수 있지만 하나 또는 두 개의 옵션만 선택할 수 있는 경우 드롭다운 상자를 사용합니다.

다음 HTML 코드 예제는 드롭다운 상자가 있는 양식입니다.

<form action="/cgi-bin/cpp_dropdown.cgi" 
                       method="post" target="_blank">
<select name="dropdown">
<option value="Maths" selected>数学</option>
<option value="Physics">物理</option>
</select>
<input type="submit" value="提交"/>
</form>

다음 C++ 프로그램은 cpp_dropdown.cgi 스크립트를 생성하여 드롭다운 상자를 통해 웹 브라우저에서 제공하는 입력을 처리합니다.

#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>向 CGI 程序传递下拉框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("dropdown");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Value Selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

CGI에서 쿠키 사용

HTTP 프로토콜은 상태 비저장 프로토콜입니다. 하지만 상업용 웹사이트의 경우 서로 다른 페이지 간의 세션 정보를 유지해야 합니다. 예를 들어 사용자는 여러 페이지의 단계를 완료한 후 등록을 완료할 수 있습니다. 그러나 모든 웹 페이지에서 사용자 세션 정보를 유지하는 방법은 무엇입니까?

대부분의 경우 쿠키를 사용하는 것은 더 나은 방문자 경험이나 웹사이트 통계를 추구하는 데 필요한 사용자 기본 설정, 구매, 수수료 및 기타 정보에 대한 정보를 기억하고 추적하는 가장 효과적인 방법입니다.

작동 방식

서버는 일부 데이터를 쿠키 형식으로 방문자의 브라우저에 보냅니다. 브라우저가 쿠키를 수락하면 쿠키는 방문자의 하드 드라이브에 일반 텍스트 기록으로 저장됩니다. 이제 방문자가 웹사이트의 다른 페이지를 방문하면 쿠키가 검색됩니다. 쿠키가 발견되면 서버는 무엇이 저장되어 있는지 알게 됩니다.

쿠키는 5개의 가변 길이 필드가 있는 일반 텍스트 데이터 레코드입니다.

  • Expires : 쿠키의 만료 날짜입니다. 이 필드를 공백으로 두면 방문자가 브라우저를 종료할 때 쿠키가 만료됩니다.

  • Domain: 웹사이트의 도메인 이름입니다.

  • 경로: 쿠키가 설정된 디렉터리 또는 웹페이지의 경로입니다. 디렉토리나 웹 페이지에서 쿠키를 검색하려는 경우 이 필드를 비워 둘 수 있습니다.

  • Secure : 이 필드에 "secure"라는 단어가 포함되어 있으면 보안 서버를 통해서만 쿠키를 검색할 수 있습니다. 이 필드를 공백으로 두면 이 제한사항이 존재하지 않는 것입니다.

  • Name=Value : 쿠키는 키-값 쌍의 형태로 설정되고 검색됩니다.

쿠키 설정

쿠키를 브라우저로 보내는 것은 매우 간단합니다. 이러한 쿠키는 Content-type 필드 앞에 HTTP 헤더와 함께 전송됩니다. 사용자 ID와 비밀번호를 쿠키로 설정한다고 가정하면, 쿠키를 설정하는 단계는 다음과 같습니다.

#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>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   cout << "设置 cookies" << endl;  
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

이 예를 통해 쿠키 설정 방법을 이해했습니다. 우리는 Set-Cookie HTTP 헤더를 사용하여 쿠키를 설정합니다.

여기서 만료, 도메인 및 경로와 같은 쿠키 설정을 위한 일부 속성은 선택 사항입니다. "Content-type:text/htmlrnrn 라인을 보내기 전에 쿠키가 설정된다는 점은 주목할 가치가 있습니다.

위 프로그램을 컴파일하고 setcookies.cgi를 생성한 후 아래 링크를 사용하여 쿠키를 설정해 보세요. 컴퓨터에 4개의 쿠키를 설정하세요:

/cgi-bin/setcookies.cgi

쿠키 가져오기

모든 설정된 쿠키를 검색하는 것은 매우 간단합니다. 쿠키는 CGI 환경 변수 HTTP_COOKIE에 저장되며 그 형식은 다음과 같습니다.

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

아래 예는 쿠키를 얻는 방법을 보여줍니다.

#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>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";
   
   // 获取环境变量
   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;
}

이제 위 프로그램을 컴파일하여 getcookies.cgi를 생성하고 다음 링크를 사용하여 컴퓨터에서 사용 가능한 모든 쿠키를 얻으십시오:

/cgi-bin/ getcookies. cgi

이렇게 하면 이전 섹션에서 설정한 4개의 쿠키와 컴퓨터의 다른 모든 쿠키를 표시하는 목록이 생성됩니다.

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

파일 업로드 예

파일을 업로드하려면 HTML 양식에 enctype 속성을 입력해야 합니다.

multipart/form-data로 설정합니다. 파일 유형이 있는 입력 태그는 "찾아보기" 버튼을 생성합니다.

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

이 코드의 결과는 다음 형식입니다.

참고: 위의 예는 의도적으로 저장되었습니다. 업로드된 파일은 우리 서버에서 비활성화되어 있습니다. 귀하의 서버에서 위 코드를 시도해 볼 수 있습니다. cpp_uploadfile.cpp

스크립트는 다음과 같습니다.

#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>CGI 中的文件上传</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   // 获取要被上传的文件列表
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
      // 在 cout 中发送数据类型
      cout << HTTPContentHeader(file->getDataType());
      // 在 cout 中写入内容
      file->writeToStream(cout);
   }
   cout << "<文件上传成功>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}
위의 예는 cout

에서 스트림에 콘텐츠를 기록하지만 다음과 같이 할 수 있습니다. 파일 스트림을 열고 업로드된 파일 콘텐츠를 대상 위치

의 파일에 저장합니다.