日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

HTTP之Cookie和Session(C++ Qt框架实现)

發(fā)布時間:2025/3/15 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HTTP之Cookie和Session(C++ Qt框架实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

?

?

基本概念

博主例子


?

基本概念

在HTTP服務器中,響應頭可以設置Cookie;

? ? ? ? ? ? ? 1. 通過Set-Cookie設置;

? ? ? ? ? ? ? 2.? 下次請求頭會自動帶上;

? ? ? ? ? ? ? 3. Cookie是鍵值對,可以設置多個;

?

Cookie屬性:

? ? ? ? ? ? ? 1. 通過max-age和expires設置過期時間;

? ? ? ? ? ? ? 2. Secure只在https的時候發(fā)送;

? ? ? ? ? ? ? 3. HttpOnly無法通過document.cookie訪問

?

HttpOnly是為了避免CSRF攻擊,網頁注入腳本,或者使用域名獲取用戶Cookie所以要禁止重要的數據,通過JavaScript進行訪問,能夠保證用戶數據安全;

?

下面來說明下Cookie和Session

? ? ? ? ? ? ? 1. Cookie?不等于 Session;

? ? ? ? ? ? ? 2. Session?有很多種實現(xiàn)方法;

? ? ? ? ? ? ? 3. 其中一個就是用Cookie?來保存 Session;

?

?

博主例子

如下偽代碼:設置多個Cookie

?

運行截圖如下:

其中對應的代碼為:

這里有一個max-age。改變服務器為wuCookie

如下:

10s后,在此發(fā)起請求,看看瀏覽器的請求頭!

可以看到ID已經過期,只剩下name了。

?

下面來演示下把一個域名下的所有子域名都設置Cookie;

這里只要設置domain=xxx.com這樣a.xxx.com和b.xxx.com都可以使用一個Cookie。

我這里是Win7 先設置一個Host

對應的代碼如下:

運行截圖如下:

下面是www的二級域名:

程序結構如下:


widget.h

#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_HEADER class QTcpServer; class QTcpSocket; QT_END_NAMESPACEnamespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();protected slots:void newConnectionSlot();void errorStringSlot();void btnClicked();void sendMsg();private:Ui::Widget *ui;QTcpServer *m_tcpServer;QTcpSocket *m_tcpSocket; };#endif // WIDGET_H

main.cpp

#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

widget.cpp

#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QTcpServer> #include <QTcpSocket>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);m_tcpServer = new QTcpServer(this);m_tcpServer->listen(QHostAddress::Any, 80);connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btnClicked()));connect(m_tcpServer, SIGNAL(newConnection()), this, SLOT(newConnectionSlot()));connect(m_tcpServer, SIGNAL(acceptError(QAbstractSocket::SocketError)), this, SLOT(errorStringSlot())); }Widget::~Widget() {delete ui;m_tcpServer->close(); }void Widget::newConnectionSlot() {qDebug() << "newConnectionSlot80() called";m_tcpSocket = m_tcpServer->nextPendingConnection();sendMsg(); }void Widget::errorStringSlot() {qDebug() << m_tcpServer->errorString(); }int choose = 0;void Widget::btnClicked() {if(choose == 0){ui->pushButton->setText("無Cookie");choose++;}else if(choose == 1){ui->pushButton->setText("domin相關");choose++;}else{ui->pushButton->setText("有max-age");choose = 0;} }void Widget::sendMsg() {QString contentStr;QString str;contentStr = "<html>""<head>""<title>""Socket 80""</title>""</head>""<body>""<h1>Socket 80</h1>""</body>""<script>"" console.log(document.cookie)""</script>""</html>";if(ui->pushButton->text() == "有max-age"){str = "HTTP/1.1 200 OK\r\n";str.append("Server:nginx\r\n");str.append("Content-Type:text/html\r\n");str.append("Access-Control-Allow-Origin: *\r\n");str.append("Set-Cookie: id=123456; max-age=10\r\n");str.append("Set-Cookie: name=123456\r\n");str.append(QString("Content-Length:%1\r\n\r\n").arg(contentStr.size()));str.append(contentStr);}else if(ui->pushButton->text() == "無Cookie"){str = "HTTP/1.1 200 OK\r\n";str.append("Server:nginx\r\n");str.append("Content-Type:text/html\r\n");str.append("Access-Control-Allow-Origin: *\r\n");str.append(QString("Content-Length:%1\r\n\r\n").arg(contentStr.size()));str.append(contentStr);}else{str = "HTTP/1.1 200 OK\r\n";str.append("Server:nginx\r\n");str.append("Content-Type:text/html\r\n");str.append("Access-Control-Allow-Origin: *\r\n");str.append("Set-Cookie: id=123456;domain=it1995.cn\r\n");str.append("Set-Cookie: name=123456\r\n");str.append(QString("Content-Length:%1\r\n\r\n").arg(contentStr.size()));str.append(contentStr);}m_tcpSocket->write(str.toStdString().c_str()); }

?

源碼打包下載地址:

https://github.com/fengfanchen/Qt/tree/master/CookieHTTPDemo

?

?

?

?

?

總結

以上是生活随笔為你收集整理的HTTP之Cookie和Session(C++ Qt框架实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。