Lập trình web C ++

CGI là gì?

  • Giao diện Cổng chung, hay CGI, là một tập hợp các tiêu chuẩn xác định cách thông tin được trao đổi giữa máy chủ web và một tập lệnh tùy chỉnh.

  • Các thông số kỹ thuật CGI hiện được duy trì bởi NCSA và NCSA định nghĩa CGI như sau:

  • Giao diện cổng thông thường, hoặc CGI, là một tiêu chuẩn cho các chương trình cổng bên ngoài để giao tiếp với máy chủ thông tin như máy chủ HTTP.

  • Phiên bản hiện tại là CGI / 1.1 và CGI / 1.2 đang được hoàn thiện.

Duyệt web

Để hiểu khái niệm về CGI, hãy xem điều gì sẽ xảy ra khi chúng ta nhấp vào siêu liên kết để duyệt qua một trang web hoặc URL cụ thể.

  • Trình duyệt của bạn liên hệ với máy chủ web HTTP và yêu cầu URL. tên tệp.

  • Máy chủ Web sẽ phân tích cú pháp URL và sẽ tìm kiếm tên tệp. Nếu nó tìm thấy tệp được yêu cầu thì máy chủ web sẽ gửi tệp đó trở lại trình duyệt, nếu không sẽ gửi thông báo lỗi cho biết rằng bạn đã yêu cầu tệp sai.

  • Trình duyệt web nhận phản hồi từ máy chủ web và hiển thị tệp đã nhận hoặc thông báo lỗi dựa trên phản hồi nhận được.

Tuy nhiên, có thể thiết lập máy chủ HTTP theo cách mà bất cứ khi nào một tệp trong một thư mục nhất định được yêu cầu, tệp đó sẽ không được gửi lại; thay vào đó, nó được thực thi như một chương trình và kết quả được tạo ra từ chương trình được gửi trở lại trình duyệt của bạn để hiển thị.

Giao diện cổng chung (CGI) là một giao thức chuẩn để cho phép các ứng dụng (được gọi là chương trình CGI hoặc tập lệnh CGI) tương tác với máy chủ Web và với máy khách. Các chương trình CGI này có thể được viết bằng Python, PERL, Shell, C hoặc C ++, v.v.

Sơ đồ kiến ​​trúc CGI

Chương trình đơn giản sau đây cho thấy một kiến ​​trúc đơn giản của CGI:

Cấu hình máy chủ web

Trước khi bạn tiến hành Lập trình CGI, hãy đảm bảo rằng Máy chủ Web của bạn hỗ trợ CGI và nó được cấu hình để xử lý các Chương trình CGI. Tất cả các Chương trình CGI sẽ được thực thi bởi máy chủ HTTP được lưu giữ trong một thư mục được cấu hình trước. Thư mục này được gọi là thư mục CGI và theo quy ước, nó được đặt tên là / var / www / cgi-bin. Theo quy ước, các tệp CGI sẽ có phần mở rộng là.cgi, mặc dù chúng có thể thực thi C ++.

Theo mặc định, Apache Web Server được cấu hình để chạy các chương trình CGI trong / var / www / cgi-bin. Nếu bạn muốn chỉ định bất kỳ thư mục nào khác để chạy các tập lệnh CGI của mình, bạn có thể sửa đổi phần sau trong tệp 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>

Ở đây, tôi giả sử rằng bạn đã thiết lập và chạy thành công Máy chủ Web và bạn có thể chạy bất kỳ chương trình CGI nào khác như Perl hoặc Shell, v.v.

Chương trình CGI đầu tiên

Xem xét nội dung Chương trình C ++ sau:

#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 - First CGI Program</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<h2>Hello World! This is my first CGI program</h2>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Biên dịch đoạn mã trên và đặt tên tệp thực thi là cplusplus.cgi. Tệp này đang được lưu trong thư mục / var / www / cgi-bin và nó có nội dung như sau. Trước khi chạy chương trình CGI, hãy đảm bảo rằng bạn đã thay đổi chế độ tệp bằng cách sử dụngchmod 755 cplusplus.cgi Lệnh UNIX để thực thi tệp.

Chương trình CGI đầu tiên của tôi

Chương trình C ++ ở trên là một chương trình đơn giản đang ghi đầu ra của nó trên màn hình tức là tệp STDOUT. Có một tính năng quan trọng và bổ sung có sẵn đó là in dòng đầu tiênContent-type:text/html\r\n\r\n. Dòng này được gửi trở lại trình duyệt và chỉ định loại nội dung sẽ hiển thị trên màn hình trình duyệt. Bây giờ chắc hẳn bạn đã hiểu khái niệm cơ bản về CGI và bạn có thể viết nhiều chương trình CGI phức tạp bằng Python. Một chương trình C ++ CGI có thể tương tác với bất kỳ hệ thống bên ngoài nào khác, chẳng hạn như RDBMS, để trao đổi thông tin.

Tiêu đề HTTP

Dòng Content-type:text/html\r\n\r\nlà một phần của tiêu đề HTTP, được gửi đến trình duyệt để hiểu nội dung. Tất cả tiêu đề HTTP sẽ ở dạng sau:

HTTP Field Name: Field Content
 
For Example
Content-type: text/html\r\n\r\n

Có một số tiêu đề HTTP quan trọng khác mà bạn sẽ sử dụng thường xuyên trong Lập trình CGI của mình.

Sr.No Tiêu đề & Mô tả
1

Content-type:

Một chuỗi MIME xác định định dạng của tệp được trả về. Ví dụ là Kiểu nội dung: text / html.

2

Expires: Date

Ngày thông tin trở nên không hợp lệ. Điều này sẽ được trình duyệt sử dụng để quyết định khi nào một trang cần được làm mới. Chuỗi ngày hợp lệ phải có định dạng 01/01/1998 12:00:00 GMT.

3

Location: URL

URL sẽ được trả lại thay vì URL được yêu cầu. Bạn có thể sử dụng tệp này để chuyển hướng một yêu cầu đến bất kỳ tệp nào.

4

Last-modified: Date

Ngày sửa đổi cuối cùng của tài nguyên.

5

Content-length: N

Độ dài, tính bằng byte, của dữ liệu được trả về. Trình duyệt sử dụng giá trị này để báo cáo thời gian tải xuống ước tính cho một tệp.

6

Set-Cookie: String

Đặt cookie được chuyển qua chuỗi .

Biến môi trường CGI

Tất cả chương trình CGI sẽ có quyền truy cập vào các biến môi trường sau. Các biến này đóng một vai trò quan trọng trong khi viết bất kỳ chương trình CGI nào.

Sr.No Tên và mô tả biến
1

CONTENT_TYPE

Loại dữ liệu của nội dung, được sử dụng khi máy khách đang gửi nội dung đính kèm đến máy chủ. Ví dụ: tải lên tệp, v.v.

2

CONTENT_LENGTH

Độ dài của thông tin truy vấn chỉ có sẵn cho các yêu cầu ĐĂNG.

3

HTTP_COOKIE

Trả về các cookie đã đặt ở dạng cặp khóa & giá trị.

4

HTTP_USER_AGENT

Trường tiêu đề yêu cầu Tác nhân người dùng chứa thông tin về tác nhân người dùng bắt nguồn yêu cầu. Nó là một tên của trình duyệt web.

5

PATH_INFO

Đường dẫn cho tập lệnh CGI.

6

QUERY_STRING

Thông tin mã hóa URL được gửi với yêu cầu phương thức GET.

7

REMOTE_ADDR

Địa chỉ IP của máy chủ từ xa thực hiện yêu cầu. Điều này có thể hữu ích cho việc ghi nhật ký hoặc cho mục đích xác thực.

số 8

REMOTE_HOST

Tên đầy đủ đủ điều kiện của máy chủ thực hiện yêu cầu. Nếu thông tin này không có sẵn thì REMOTE_ADDR có thể được sử dụng để lấy địa chỉ IR.

9

REQUEST_METHOD

Phương pháp được sử dụng để thực hiện yêu cầu. Các phương pháp phổ biến nhất là GET và POST.

10

SCRIPT_FILENAME

Đường dẫn đầy đủ đến tập lệnh CGI.

11

SCRIPT_NAME

Tên của tập lệnh CGI.

12

SERVER_NAME

Tên máy chủ hoặc Địa chỉ IP của máy chủ.

13

SERVER_SOFTWARE

Tên và phiên bản của phần mềm mà máy chủ đang chạy.

Đây là chương trình CGI nhỏ để liệt kê tất cả các biến 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 Environment Variables</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>";
      
      // attempt to retrieve value of environment variable
      char *value = getenv( ENV[ i ].c_str() );  
      if ( value != 0 ) {
         cout << value;                                 
      } else {
         cout << "Environment variable does not exist.";
      }
      cout << "</td></tr>\n";
   }
   
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Thư viện C ++ CGI

Đối với các ví dụ thực tế, bạn sẽ cần thực hiện nhiều thao tác bằng chương trình CGI của mình. Có một thư viện CGI được viết cho chương trình C ++ mà bạn có thể tải xuống từ ftp://ftp.gnu.org/gnu/cgicc/ và làm theo các bước để cài đặt thư viện -

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

Bạn có thể kiểm tra tài liệu liên quan có sẵn tại 'Tài liệu C ++ CGI Lib .

Phương thức GET và POST

Chắc hẳn bạn đã gặp phải nhiều tình huống khi bạn cần chuyển một số thông tin từ trình duyệt đến máy chủ web và cuối cùng là Chương trình CGI của mình. Thông thường nhất, trình duyệt sử dụng hai phương pháp để chuyển thông tin này đến máy chủ web. Các phương thức này là GET Method và POST Method.

Truyền thông tin bằng phương pháp GET

Phương thức GET gửi thông tin người dùng đã mã hóa được thêm vào yêu cầu trang. Trang và thông tin được mã hóa được phân tách bằng dấu? nhân vật như sau -

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

Phương thức GET là phương thức mặc định để chuyển thông tin từ trình duyệt đến máy chủ web và nó tạo ra một chuỗi dài xuất hiện trong hộp Location: của trình duyệt của bạn. Không bao giờ sử dụng phương thức GET nếu bạn có mật khẩu hoặc thông tin nhạy cảm khác để chuyển đến máy chủ. Phương thức GET có giới hạn về kích thước và bạn có thể chuyển tối đa 1024 ký tự trong một chuỗi yêu cầu.

Khi sử dụng phương thức GET, thông tin được chuyển bằng tiêu đề QUERY_STRING http và sẽ có thể truy cập được trong Chương trình CGI của bạn thông qua biến môi trường QUERY_STRING.

Bạn có thể chuyển thông tin bằng cách chỉ cần nối các cặp khóa và giá trị cùng với bất kỳ URL nào hoặc bạn có thể sử dụng thẻ HTML <FORM> để chuyển thông tin bằng phương thức GET.

Ví dụ về URL đơn giản: Phương thức lấy

Đây là một URL đơn giản sẽ chuyển hai giá trị đến chương trình hello_get.py bằng phương thức GET.

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

Dưới đây là một chương trình để tạo cpp_get.cgiChương trình CGI để xử lý đầu vào do trình duyệt web cung cấp. Chúng tôi sẽ sử dụng thư viện C ++ CGI giúp dễ dàng truy cập thông tin đã chuyển -

#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>Using GET and POST Methods</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "First name: " << **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 << "Last name: " << **fi << endl;  
   } else {
      cout << "No text entered for last name" << endl;  
   }
   
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Bây giờ, hãy biên dịch chương trình trên như sau:

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

Tạo cpp_get.cgi và đặt nó vào thư mục CGI của bạn và cố gắng truy cập bằng liên kết sau:

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

Điều này sẽ tạo ra kết quả sau:

First name: ZARA 
Last name: ALI

MẪU đơn giản Ví dụ: Phương pháp GET

Đây là một ví dụ đơn giản chuyển hai giá trị bằng HTML FORM và nút gửi. Chúng tôi sẽ sử dụng cùng một tập lệnh CGI cpp_get.cgi để xử lý đầu vào này.

<form action = "/cgi-bin/cpp_get.cgi" method = "get">
   First Name: <input type = "text" name = "first_name">  <br />
 
   Last Name: <input type = "text" name = "last_name" />
   <input type = "submit" value = "Submit" />
</form>

Đây là kết quả thực tế của biểu mẫu trên. Bạn điền Họ và Tên rồi bấm nút gửi để xem kết quả.

Truyền thông tin bằng phương pháp POST

Một phương pháp truyền thông tin đến chương trình CGI thường đáng tin cậy hơn là phương pháp POST. Điều này đóng gói thông tin theo cách giống hệt như các phương thức GET, nhưng thay vì gửi nó dưới dạng một chuỗi văn bản sau dấu? trong URL nó sẽ gửi nó dưới dạng một tin nhắn riêng biệt. Thông báo này được đưa vào tập lệnh CGI ở dạng đầu vào chuẩn.

Chương trình cpp_get.cgi tương tự cũng sẽ xử lý phương thức POST. Chúng ta hãy lấy ví dụ tương tự như trên, chuyển hai giá trị bằng HTML FORM và nút gửi nhưng lần này với phương thức POST như sau:

<form action = "/cgi-bin/cpp_get.cgi" method = "post">
   First Name: <input type = "text" name = "first_name"><br />
   Last Name: <input type = "text" name = "last_name" />
 
   <input type = "submit" value = "Submit" />
</form>

Đây là kết quả thực tế của biểu mẫu trên. Bạn điền Họ và Tên rồi bấm nút gửi để xem kết quả.

Chuyển dữ liệu hộp kiểm sang chương trình CGI

Hộp kiểm được sử dụng khi bắt buộc phải chọn nhiều tùy chọn.

Đây là mã HTML mẫu cho biểu mẫu có hai hộp kiểm -

<form action = "/cgi-bin/cpp_checkbox.cgi" method = "POST" target = "_blank">
   <input type = "checkbox" name = "maths" value = "on" /> Maths
   <input type = "checkbox" name = "physics" value = "on" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

Kết quả của mã này là dạng sau:

Dưới đây là chương trình C ++, sẽ tạo ra tập lệnh cpp_checkbox.cgi để xử lý đầu vào do trình duyệt web cung cấp thông qua nút hộp kiểm.

#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>Checkbox Data to 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;
}

Chuyển dữ liệu nút radio sang chương trình CGI

Các nút Radio được sử dụng khi chỉ cần chọn một tùy chọn.

Đây là mã HTML mẫu cho biểu mẫu có hai nút radio -

<form action = "/cgi-bin/cpp_radiobutton.cgi" method = "post" target = "_blank">
   <input type = "radio" name = "subject" value = "maths" checked = "checked"/> Maths 
   <input type = "radio" name = "subject" value = "physics" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

Kết quả của mã này là dạng sau:

Dưới đây là chương trình C ++, sẽ tạo ra tập lệnh cpp_radiobutton.cgi để xử lý đầu vào do trình duyệt web cung cấp thông qua các nút radio.

#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>Radio Button Data to 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;
}

Chuyển dữ liệu vùng văn bản sang chương trình CGI

Phần tử TEXTAREA được sử dụng khi văn bản nhiều dòng phải được chuyển đến Chương trình CGI.

Đây là mã HTML mẫu cho biểu mẫu có hộp TEXTAREA -

<form action = "/cgi-bin/cpp_textarea.cgi" method = "post" target = "_blank">
   <textarea name = "textcontent" cols = "40" rows = "4">
      Type your text here...
   </textarea>
   <input type = "submit" value = "Submit" />
</form>

Kết quả của mã này là dạng sau:

Dưới đây là chương trình C ++, sẽ tạo ra tập lệnh cpp_textarea.cgi để xử lý đầu vào do trình duyệt web cung cấp thông qua vùng văn bản.

#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>Text Area Data to 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;
}

Chuyển dữ liệu hộp thả xuống cho chương trình CGI

Hộp thả xuống được sử dụng khi chúng ta có nhiều tùy chọn nhưng sẽ chỉ có một hoặc hai tùy chọn được chọn.

Đây là mã HTML mẫu cho biểu mẫu có một hộp thả xuống -

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

Kết quả của mã này là dạng sau:

Dưới đây là chương trình C ++, sẽ tạo ra tập lệnh cpp_dropdown.cgi để xử lý đầu vào do trình duyệt web cung cấp thông qua hộp thả xuống.

#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>Drop Down Box Data to 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;
}

Sử dụng Cookie trong CGI

Giao thức HTTP là một giao thức không trạng thái. Nhưng đối với một trang web thương mại, cần phải duy trì thông tin phiên giữa các trang khác nhau. Ví dụ: một đăng ký người dùng kết thúc sau khi hoàn thành nhiều trang. Nhưng làm thế nào để duy trì thông tin phiên của người dùng trên tất cả các trang web.

Trong nhiều tình huống, sử dụng cookie là phương pháp hiệu quả nhất để ghi nhớ và theo dõi các sở thích, mua hàng, hoa hồng và các thông tin khác cần thiết để có trải nghiệm khách truy cập hoặc thống kê trang web tốt hơn.

Làm thế nào nó hoạt động

Máy chủ của bạn gửi một số dữ liệu đến trình duyệt của khách truy cập dưới dạng cookie. Trình duyệt có thể chấp nhận cookie. Nếu có, nó sẽ được lưu trữ dưới dạng một bản ghi văn bản thuần túy trên ổ cứng của khách truy cập. Bây giờ, khi khách truy cập đến một trang khác trên trang web của bạn, cookie sẽ có sẵn để truy xuất. Sau khi được truy xuất, máy chủ của bạn biết / ghi nhớ những gì đã được lưu trữ.

Cookie là một bản ghi dữ liệu văn bản thuần túy gồm 5 trường có độ dài thay đổi -

  • Expires- Điều này hiển thị ngày cookie sẽ hết hạn. Nếu ô này trống, cookie sẽ hết hạn khi khách truy cập thoát khỏi trình duyệt.

  • Domain - Điều này hiển thị tên miền của trang web của bạn.

  • Path- Điều này hiển thị đường dẫn đến thư mục hoặc trang web đặt cookie. Điều này có thể để trống nếu bạn muốn lấy cookie từ bất kỳ thư mục hoặc trang nào.

  • Secure- Nếu trường này chứa từ "an toàn" thì cookie chỉ có thể được truy xuất bằng máy chủ bảo mật. Nếu trường này trống, không có hạn chế như vậy tồn tại.

  • Name = Value - Cookie được thiết lập và truy xuất dưới dạng các cặp khóa và giá trị.

Thiết lập Cookie

Rất dễ dàng để gửi cookie đến trình duyệt. Các cookie này sẽ được gửi cùng với Tiêu đề HTTP trước khi Loại nội dung được gửi. Giả sử bạn muốn đặt UserID và Mật khẩu làm cookie. Vì vậy, cài đặt cookie sẽ được thực hiện như sau

#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.tutorialspoint.com;\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 << "Setting cookies" << endl;  
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Từ ví dụ này, bạn chắc hẳn đã hiểu cách đặt cookie. Chúng tôi sử dụngSet-Cookie Tiêu đề HTTP để đặt cookie.

Tại đây, bạn có thể tùy chọn đặt các thuộc tính cookie như Expires, Domain và Path. Đáng chú ý là cookie được đặt trước khi gửi dòng ma thuật"Content-type:text/html\r\n\r\n.

Biên dịch chương trình trên để tạo setcookies.cgi và cố gắng đặt cookie bằng liên kết sau. Nó sẽ đặt bốn cookie trên máy tính của bạn -

/cgi-bin/setcookies.cgi

Truy xuất Cookie

Thật dễ dàng để truy xuất tất cả các cookie đã đặt. Cookie được lưu trữ trong biến môi trường CGI HTTP_COOKIE và chúng sẽ có dạng sau.

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

Đây là một ví dụ về cách truy xuất cookie.

#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\">";
   
   // get environment variables
   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;
}

Bây giờ, hãy biên dịch chương trình trên để tạo getcookies.cgi và cố gắng lấy danh sách tất cả các cookie có sẵn trong máy tính của bạn -

/cgi-bin/getcookies.cgi

Thao tác này sẽ tạo ra danh sách tất cả bốn cookie được đặt trong phần trước và tất cả các cookie khác được đặt trong máy tính của bạn -

UserID XYZ 
Password XYZ123 
Domain www.tutorialspoint.com 
Path /perl

Ví dụ về Tải lên Tệp

Để tải tệp lên, biểu mẫu HTML phải có thuộc tính enctype được đặt thành multipart/form-data. Thẻ đầu vào có loại tệp sẽ tạo nút "Duyệt qua".

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

Kết quả của mã này là dạng sau:

Note- Ví dụ trên đã bị vô hiệu hóa có chủ ý để ngăn mọi người tải tệp lên máy chủ của chúng tôi. Nhưng bạn có thể thử mã trên với máy chủ của mình.

Đây là kịch bản cpp_uploadfile.cpp để xử lý tải lên tệp -

#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>File Upload in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   // get list of files to be uploaded
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
      // send data type at cout.
      cout << HTTPContentHeader(file->getDataType());
      // write content at cout.
      file->writeToStream(cout);
   }
   cout << "<File uploaded successfully>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Ví dụ trên là để viết nội dung tại cout nhưng bạn có thể mở luồng tệp của mình và lưu nội dung của tệp đã tải lên trong một tệp ở vị trí mong muốn.

Hy vọng bạn đã thích hướng dẫn này. Nếu có, hãy gửi phản hồi cho chúng tôi.