c ++ เขียนโปรแกรมเว็บ
CGI คืออะไร?
- Common Gateway Interface (CGI) เป็นมาตรฐานที่กำหนดวิธีการแลกเปลี่ยนข้อมูลระหว่างเว็บเซิร์ฟเวอร์และฝั่งไคลเอ็นต์สคริปต์
- สเปซีจีจะยังคงอยู่ในขณะนี้โดย CGI NCSA, NCSA ถูกกำหนดไว้ดังต่อไปนี้:
- Common Gateway Interface (CGI) เป็นประตูสำหรับโปรแกรมภายนอกกับเซิร์ฟเวอร์ข้อมูล (เช่นเซิร์ฟเวอร์ HTTP) มาตรฐานอินเตอร์เฟซที่เทียบท่า
- รุ่นปัจจุบันเป็น CGI / 1.1, CGI / 1.2 รุ่นก้าวหน้า
เว็บเบราเซอร์
เพื่อให้เข้าใจแนวคิดของ CGI ลองคลิกที่เชื่อมโยงหลายมิติเรียกดูหน้าเว็บหรือ URL และดูสิ่งที่เกิดขึ้น
- เบราว์เซอร์ของคุณเชื่อมโยงบน HTTP เว็บเซิร์ฟเวอร์และขอ URL ที่เป็นชื่อไฟล์
- เว็บเซิร์ฟเวอร์แก้ไข URL และหาชื่อไฟล์ หากคุณพบแฟ้มที่ร้องขอเว็บเซิร์ฟเวอร์จะส่งแฟ้มกลับไปยังเบราว์เซอร์มิฉะนั้นส่งข้อความผิดพลาดแสดงว่าคุณกำลังร้องขอไฟล์ผิด
- เว็บเบราเซอร์ที่จะได้รับการตอบสนองจากเว็บเซิร์ฟเวอร์และขึ้นอยู่กับการตอบสนองที่ได้รับในการแสดงไฟล์หรือข้อผิดพลาด
แต่ในลักษณะที่จะสร้างขึ้นเซิร์ฟเวอร์ HTTP โดยไม่คำนึงถึงเมื่อจะขอไดเรกทอรีไฟล์เซิร์ฟเวอร์ HTTP จะไม่ส่งกลับไฟล์ แต่ในรูปแบบของการดำเนินโครงการและการดำเนินงานของการส่งออกที่สร้างขึ้นจะถูกส่งกลับไปยังจอแสดงผลเบราว์เซอร์ ออก
Common Gateway Interface (CGI) คือการทำให้โปรแกรมประยุกต์ (เรียกว่าโปรแกรม CGI หรือสคริปต์ CGI) จะทำงานร่วมกับเว็บเซิร์ฟเวอร์และลูกค้ามีปฏิสัมพันธ์โปรโตคอลมาตรฐาน โปรแกรม CGI เหล่านี้สามารถใช้งูหลาม, Perl, Shell, C หรือ C ++ ฯลฯ เพื่อเตรียมความพร้อม
แผนภูมิ CGI
ภาพประกอบต่อไปนี้แสดงให้เห็นถึงสถาปัตยกรรมที่ CGI:
การกำหนดค่าเซิร์ฟเวอร์เว็บ
ก่อนที่คุณจะทำให้การเขียนโปรแกรม CGI, ตรวจสอบให้แน่ใจว่าเว็บเซิร์ฟเวอร์ของคุณสนับสนุน CGI, และได้รับการกำหนดค่าการจัดการโปรแกรม CGI โปรแกรม CGI ทั้งหมดดำเนินการโดยเซิร์ฟเวอร์ HTTP จะต้องมีการไดเรกทอรีที่กำหนดไว้ล่วงหน้า ไดเรกทอรีนี้เรียกว่าไดเรกทอรี 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 หรือเชลล์และชอบ
โปรแกรม 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 / directory cgi-bin ก่อนที่จะใช้โปรแกรม CGI กรุณาใช้chmod 755 cplusplus.cgi คำสั่ง UNIXเพื่อเปลี่ยนโหมดไฟล์ให้แน่ใจว่าไฟล์เป็นปฏิบัติการ แฟ้มที่ปฏิบัติการ Access คุณจะเห็นผลลัพธ์ต่อไปนี้:
สวัสดีชาวโลกนี้เป็นโปรแกรม CGI ครั้งแรกของฉัน
ดังกล่าวข้างต้นโปรแกรม C ++ เป็นโปรแกรมที่ง่ายก็เขียนไว้ในไฟล์ที่ส่งออก STDOUT จะปรากฏบนหน้าจอที่นี่ก็เป็นที่น่าสังเกตว่าบรรทัดแรกของการส่งออกของชนิดของเนื้อหา: text / html \ r \ n \ r \ nบรรทัดนี้จะถูกส่งกลับไปยังเบราว์เซอร์และปลายทางที่จะแสดงในเบราว์เซอร์ชนิดเนื้อหาของหน้าต่าง คุณต้องเข้าใจแนวคิดพื้นฐานของ CGI เพื่อให้เป็นไปต่อใช้งูหลามที่จะเขียนโปรแกรม CGI ที่ซับซ้อนมากขึ้น โปรแกรม CGI c ++ สามารถนำมาใช้กับระบบภายนอกอื่น ๆ (เช่น RDBMS) ในการโต้ตอบ
ข้อมูลส่วนหัว HTTP
สายContent-Type: text / html \ r \ n \ r \ n เป็นส่วนหนึ่งของข้อมูลที่ส่วนหัวของ HTTP จะถูกส่งไปยังเบราว์เซอร์ในการสั่งซื้อเพื่อให้เข้าใจเนื้อหาของหน้าในรูปแบบของข้อมูลส่วนหัว HTTP จะเป็นดังนี้:
HTTP 字段名称: 字段内容 例如 Content-type: text/html\r\n\r\n
มีข้อมูลส่วนหัว HTTP อื่น ๆ ที่สำคัญเหล่านี้มักจะถูกนำมาใช้ในการเขียนโปรแกรม CGI ของคุณ
头信息 | 描述 |
---|---|
Content-type: | MIME 字符串,定义返回的文件格式。例如 Content-type:text/html。 |
Expires: Date | 信息变成无效的日期。浏览器使用它来判断一个页面何时需要刷新。一个有效的日期字符串的格式应为 01 Jan 1998 12:00:00 GMT。 |
Location: URL | 这个 URL 是指应该返回的 URL,而不是请求的 URL。你可以使用它来重定向一个请求到任意的文件。 |
Last-modified: Date | 资源的最后修改日期。 |
Content-length: N | 要返回的数据的长度,以字节为单位。浏览器使用这个值来表示一个文件的预计下载时间。 |
Set-Cookie: String | 通过string设置 cookie。 |
ตัวแปร CGI สิ่งแวดล้อม
โปรแกรม CGI ทั้งหมดสามารถเข้าถึงตัวแปรสภาพแวดล้อมดังต่อไปนี้ ตัวแปรเหล่านี้เมื่อเขียนโปรแกรม CGI มีบทบาทสำคัญมาก
变量名 | 描述 |
---|---|
CONTENT_TYPE | 内容的数据类型。当客户端向服务器发送附加内容时使用。例如,文件上传等功能。 |
CONTENT_LENGTH | 查询的信息长度。只对 POST 请求可用。 |
HTTP_COOKIE | 以键 & 值对的形式返回设置的 cookies。 |
HTTP_USER_AGENT | 用户代理请求标头字段,递交用户发起请求的有关信息,包含了浏览器的名称、版本和其他平台性的附加信息。 |
PATH_INFO | CGI 脚本的路径。 |
QUERY_STRING | 通过 GET 方法发送请求时的 URL 编码信息,包含 URL 中问号后面的参数。 |
REMOTE_ADDR | 发出请求的远程主机的 IP 地址。这在日志记录和认证时是非常有用的。 |
REMOTE_HOST | 发出请求的主机的完全限定名称。如果此信息不可用,则可以用 REMOTE_ADDR 来获取 IP 地址。 |
REQUEST_METHOD | 用于发出请求的方法。最常见的方法是 GET 和 POST。 |
SCRIPT_FILENAME | CGI 脚本的完整路径。 |
SCRIPT_NAME | CGI 脚本的名称。 |
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
ในตัวอย่างจริงที่คุณต้องดำเนินการหลายโปรแกรม CGI มีโปรแกรมที่ออกแบบมาเฉพาะสำหรับห้องสมุด CGI c ++ เขียนเราสามารถเป็น ftp://ftp.gnu.org/gnu/cgicc/~~V ดาวน์โหลดห้องสมุด CGI นี้ที่ห้องสมุดและติดตั้งตามขั้นตอนต่อไปนี้:
$tar xzf cgicc-X.X.X.tar.gz $cd cgicc-X.X.X/ $./configure --prefix=/usr $make $make install
คุณสามารถคลิกที่ c ++ ซีจี Lib เอกสาร ดูเอกสารห้องสมุด
GET และวิธีการ POST
คุณอาจได้พบสถานการณ์ดังกล่าวเมื่อคุณต้องผ่านข้อมูลบางอย่างจากเบราว์เซอร์ไปยังเว็บเซิร์ฟเวอร์และในที่สุดก็ส่งผ่านไปยังโปรแกรม CGI โดยปกติเบราว์เซอร์สองวิธีที่จะใช้ข้อมูลนี้ไปยังเว็บเซิร์ฟเวอร์ที่มีวิธี GET และ POST
ใช้วิธีการ GET เพื่อส่งผ่านข้อมูล
มีวิธีการในการส่งข้อมูลของผู้ใช้เข้ารหัสผนวกเข้ากับการร้องขอเพจ หน้าและการเข้ารหัสข้อมูลแยกจากกันโดยตัวอักษรดังนี้ ?:
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
วิธีการได้รับคือวิธีการเริ่มต้นจากเบราว์เซอร์ในการถ่ายโอนข้อมูลเว็บเซิร์ฟเวอร์มันเป็นสายยาวของสตริงถูกสร้างขึ้นในแถบที่อยู่ของเบราว์เซอร์ เมื่อมีการใช้รหัสผ่านหรือข้อมูลสำคัญอื่น ๆ ที่คุณส่งผ่านไปยังเซิร์ฟเวอร์ที่ไม่ได้ใช้วิธีการ GET มีวิธีการมีข้อ จำกัด ในขนาดในสตริงคำขอโอนถึง 1024 อักขระ
เมื่อคุณใช้วิธีการ GET คือการใช้ส่วนหัว QUERY_STRING HTTP เพื่อส่งข้อมูลให้ใช้ตัวแปรสภาพแวดล้อม QUERY_STRING ในโปรแกรม CGI ในการเข้าถึง
คุณสามารถให้ทันกับความสำคัญใน URL ของการเชื่อมต่อที่ง่ายที่คุณยังสามารถใช้ HTML มีวิธีการ <form> แท็กเพื่อส่งข้อมูล
ตัวอย่าง URL แบบง่าย: มีวิธีการ
นี่คือ URL ที่เรียบง่ายใช้วิธีการ GET ที่จะผ่านสองค่าที่จะ hello_get.py โปรแกรม
/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
ตัวอย่างของรูปแบบที่เรียบง่าย: มีวิธีการ
นี่คือตัวอย่างง่ายๆโดยใช้รูปแบบ HTML และปุ่มส่งผ่านไปสองค่า เราจะใช้ cpp_get.cgi สคริปต์ 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>
นี่คือผลลัพธ์ที่เกิดขึ้นจริงของฟอร์มใส่ชื่อและนามสกุลแล้วคลิกที่ปุ่มส่งเพื่อดูผล
โดยใช้วิธีการโพสต์เพื่อส่งข้อมูล
วิธีการที่เชื่อถือได้มากขึ้นของการส่งผ่านข้อมูลไปยังโปรแกรม CGI เป็นวิธีการ POST วิธีการในการบรรจุข้อมูลด้วยวิธีการได้รับวิธีเดียวกันยกเว้นว่ามันไม่ได้เป็นข้อความเป็นสตริงข้อความใน URL นี้หลังจากถูกส่งผ่านไป แต่ใส่ไว้ในข้อความที่แยกจากกันในรูปแบบของการจัดส่ง ข้อความจะถูกส่งผ่านไปยังป้อนข้อมูลมาตรฐานในรูปแบบของสคริปต์ซีจี
เรายังใช้ cpp_get.cgi ที่จะจัดการกับวิธีการ POST ลองมาตัวอย่างเดียวกันที่จะผ่านการใช้รูปแบบ HTML และปุ่มส่งสองค่า แต่คราวนี้เราจะไม่ใช้วิธีการ GET แต่วิธีการโพสต์ดังต่อไปนี้:
<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 ต่อไปนี้เป็นรูปแบบที่มีสองช่องทำเครื่องหมาย A:
<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 ต่อไปนี้เป็นรูปแบบที่มีสองปุ่ม A:
<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 เมื่อคุณต้องการถ่ายโอนข้อความหลายบรรทัดเราจะใช้องค์ประกอบของพื้นที่ข้อความ
ตัวอย่างรหัส HTML ต่อไปนี้เป็นรูปแบบพร้อมกล่อง TEXTAREA A:
<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 เป็นโปรโตคอลไร้สัญชาติ แต่สำหรับเว็บไซต์ธุรกิจจะต้องมีการเก็บข้อมูลเซสชั่นที่แตกต่างกันระหว่างหน้า ตัวอย่างเช่นผู้ใช้หลังจากเสร็จสิ้นการหลายขั้นตอนปลายหน้าลงทะเบียน แต่วิธีการที่จะรักษาข้อมูลเซสชันของผู้ใช้ในทุกหน้า
ในหลายกรณีการใช้คุกกี้คือการจำและติดตามข้อมูลเกี่ยวกับการตั้งค่าของผู้ซื้อนายหน้าและวิธีที่มีประสิทธิภาพมากที่สุดอื่น ๆ สำหรับการแสวงหาข้อมูลประสบการณ์ของผู้เข้าชมเว็บไซต์ที่ดีกว่าหรือสถิติที่จำเป็น
วิธีการทำงาน
เซิร์ฟเวอร์ในรูปแบบของคุกกี้ที่จะส่งข้อมูลบางอย่างเบราว์เซอร์ของผู้เข้าชม หากเบราว์เซอร์ยอมรับคุกกี้คุกกี้จะถูกเก็บไว้เป็นข้อความธรรมดาบันทึกไว้ในฮาร์ดไดรฟ์ของผู้เข้าชม ตอนนี้เมื่อผู้เข้าชมไปยังหน้าอื่นบนเว็บไซต์ดึงคุกกี้ เมื่อคุณพบคุกกี้เซิร์ฟเวอร์จะรู้ว่าสิ่งที่ถูกเก็บไว้
คุกกี้เป็นระเบียนข้อมูลข้อความที่บริสุทธิ์ห้าทุ่งยาวตัวแปรด้วย:
- หมดอายุ: วันหมดอายุคุกกี้ถ้าข้อมูลนี้ถูกปล่อยว่างคุกกี้จะหมดอายุเมื่อผู้เข้าชมออกจากเบราว์เซอร์
- ชื่อโดเมนของเว็บไซต์: โดเมน
- เส้นทาง: ตั้งค่าไดเรกทอรีเส้นทางคุกกี้หรือหน้าเว็บหากคุณต้องการที่จะดึงคุกกี้จากไดเรกทอรีหรือหน้าใดก็ได้ข้อมูลนี้สามารถปล่อยว่างไว้
- การรักษาความปลอดภัย: ถ้าฟิลด์นี้มีคำว่า "ปลอดภัย" แล้วคุกกี้สามารถเรียกดูผ่านเซิร์ฟเวอร์ที่เชื่อถือได้ถ้าข้อมูลนี้ถูกปล่อยว่างที่ไม่มีข้อ จำกัด อยู่
- ชื่อ = ค่า: คุกกี้ในรูปแบบของคู่ค่าคีย์ที่จะตั้งและได้รับ
การตั้งค่าคุกกี้
ส่งคุกกี้เบราว์เซอร์ที่ง่ายมาก คุกกี้เหล่านี้จะเป็นก่อนที่ข้อมูลของชนิดของเนื้อหาและส่วนหัว HTTP จะถูกส่งเข้าด้วยกัน สมมติว่าคุณต้องการที่จะตั้งค่าหมายเลขผู้ใช้และรหัสผ่านสำหรับคุกกี้ขั้นตอนการตั้งค่าคุกกี้มีดังนี้
#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; }
จากตัวอย่างนี้เราได้เรียนรู้วิธีการตั้งค่าคุกกี้เราใช้ส่วนหัวของคุกกี้ชุด HTTP เพื่อตั้งค่าคุกกี้
นี่คือคุณสมบัติในการติดตั้งคุกกี้เป็นตัวเลือกเช่นหมดอายุโดเมนและเส้นทาง เป็นมูลค่า noting, คุกกี้จะถูกส่งในเส้น"Content-Type: text / html \ r \ n \ r \ nก่อนที่จะถูกตั้งค่า
รวบรวมโปรแกรมดังกล่าวข้างต้นที่สร้าง setcookies.cgi และพยายามที่จะใช้การเชื่อมโยงต่อไปนี้เพื่อตั้งค่าคุกกี้ มันจะตั้งค่าสี่คุกกี้บนคอมพิวเตอร์ของคุณ:
/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
นี้จะผลิตรายการที่แสดงทั้งหมดอีกสี่คุกกี้คุกกี้ในชุดและคอมพิวเตอร์ของคุณ:
UserID XYZ Password XYZ123 Domain www.w3cschool.cc Path /perl
ตัวอย่างของการอัปโหลดไฟล์
อัปโหลดไฟล์รูปแบบ HTML ต้อง ENCTYPE ตั้งค่าแอตทริบิวต์multipart / form ข้อมูลแท็กใส่กับประเภทของไฟล์จะสร้างปุ่ม "Browse"
<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; }
ตัวอย่างข้างต้นคือการเขียนไปยังศาลกระแส แต่คุณสามารถเปิดสตรีมไฟล์และเนื้อหาของไฟล์ที่อัปโหลดในแฟ้มบนพื้นที่เป้าหมายที่