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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

CORS跨域限制以及预请求验证(C++ Qt框架实现)

發布時間:2025/3/15 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CORS跨域限制以及预请求验证(C++ Qt框架实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

理論

演示及代碼


理論

跨域默認情況下允許方法:GET、HEAD、POST

默認情況下允許的Content-Type:text/plain、multipart/form-data、application/x-www-form-urlencoded

如果要使用用戶自定義頭,要在被請求的服務器HTTP響應消息中加入:

Access-Control-Allow-Headers: X-Test-Cors

這個X-Test-Cors就是自定義消息頭

如果要添加新的跨域方法要添加如下消息:

Access-COntrol-Allow-Methods: PUT, Delete

如果要設置Option這個預請求時間,則要加如下消息頭:

Access-Control-Max-Age: 1000

?

演示及代碼

現在有2個頁面,都在127.0.0.1的機器上,

一個服務是80端口,一個服務是81端口,

80端口通過JavaScript獲取81端口跨域服務!

現在使用自定義消息頭!

程序運行截圖如下:

此時在81上添加允許X-Test-Cors的響應消息:

運行這個時候就沒有報錯了,并且瀏覽器有預處理和響應了!

看下這Option預處理頭和Post請求:

這里通過設置Max-Age設置預處理頭:

運行截圖如下:

程序結構如下:

widget.h

#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE class QTcpServer; class QTcpSocket; QT_END_NAMESPACEnamespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected slots:void newConnectionSlot80();void newConnectionSlot81();void errorStringSlot80();void errorStringSlot81();void sendMsg80();void sendMsg81();private:Ui::Widget *ui;QTcpServer *m_tcpServer80;QTcpSocket *m_tcpSocket80;QTcpServer *m_tcpServer81;QTcpSocket *m_tcpSocket81; };#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_tcpServer80 = new QTcpServer(this);m_tcpServer80->listen(QHostAddress::Any, 80);m_tcpServer81 = new QTcpServer(this);m_tcpServer81->listen(QHostAddress::Any, 81);connect(m_tcpServer80, SIGNAL(newConnection()), this, SLOT(newConnectionSlot80()));connect(m_tcpServer81, SIGNAL(newConnection()), this, SLOT(newConnectionSlot81()));connect(m_tcpServer80, SIGNAL(acceptError(QAbstractSocket::SocketError)), this, SLOT(errorStringSlot80()));connect(m_tcpServer81, SIGNAL(acceptError(QAbstractSocket::SocketError)), this, SLOT(errorStringSlot81()));}Widget::~Widget() {delete ui;m_tcpServer80->close();m_tcpServer81->close(); }void Widget::newConnectionSlot80() {qDebug() << "newConnectionSlot80() called";m_tcpSocket80 = m_tcpServer80->nextPendingConnection();connect(m_tcpSocket80, SIGNAL(readyRead()), this, SLOT(sendMsg80())); }void Widget::newConnectionSlot81() {qDebug() << "newConnectionSlot81() called";m_tcpSocket81 = m_tcpServer81->nextPendingConnection();connect(m_tcpSocket81, SIGNAL(readyRead()), this, SLOT(sendMsg81())); }void Widget::errorStringSlot80() {qDebug() << m_tcpServer80->errorString(); }void Widget::errorStringSlot81() {qDebug() << m_tcpServer81->errorString(); }void Widget::sendMsg80() { // QString contentStr = "<html>" // "<head>" // "<title>" // "Socket 80" // "</title>" // "</head>" // "<body>" // "<h1>Socket 80</h1>" // "<script src=\"http://127.0.0.1:81\"></script>" // "</body>" // "</html>";QString contentStr = "<html>""<head>""<title>""Socket 80""</title>""</head>""<body>""<h1>Socket 80</h1>""<script>"" fetch('http://127.0.0.1:81',{\n"" method: 'POST',\n"" headers:{\n"" 'X-Test-Cors': '123'\n"" }\n"" })\n""</script>""</body>""</html>";//send msgQString str = "HTTP/1.1 200 OK\r\n";str.append("Server:nginx\r\n");str.append("Content-Type:text/html\r\n");str.append("Connection:keep-alive\r\n");str.append(QString("Content-Length:%1\r\n\r\n").arg(contentStr.size()));str.append(contentStr);qDebug() << str;m_tcpSocket80->write(str.toStdString().c_str()); }void Widget::sendMsg81() {QString contentStr = "<html>""<head>""<title>""Socket 81""</title>""</head>""<body>""<h1>Socket 81</h1>""</body>""</html>";//send msgQString str = "HTTP/1.1 200 OK\r\n";str.append("Server:nginx\r\n");str.append("Content-Type:text/html\r\n");str.append("Connection:keep-alive\r\n");str.append("Access-Control-Allow-Origin: *\r\n");str.append("Access-Control-Allow-Headers: X-Test-Cors\r\n");str.append("Access-Control-Max-Age: 1000\r\n");str.append(QString("Content-Length:%1\r\n\r\n").arg(contentStr.size()));str.append(contentStr);qDebug() << str;m_tcpSocket81->write(str.toStdString().c_str()); }

?

程序打包下載:

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

總結

以上是生活随笔為你收集整理的CORS跨域限制以及预请求验证(C++ Qt框架实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲视频一区在线 | 欧美在线观看免费高清 | 欧美激情一区二区三级高清视频 | 久久综合精品国产二区无码不卡 | av在线资源网 | 久久91精品国产91久久小草 | 成人做爰9片免费视频 | 成人一级视频在线观看 | 日本一区免费看 | 激情开心网站 | 欧美一区二区区 | 天天射天天色天天干 | 蜜乳av 懂色av 粉嫩av | 扒开伸进免费视频 | 香蕉网在线观看 | 欧美精品性视频 | 欧美丰满美乳xxⅹ高潮www | 国产传媒av在线 | 91av视频在线 | 韩国一区二区三区四区 | 婷婷久久久久久 | 日本中文字幕影院 | 麻豆视频污 | 欧美人一级淫片a免费播放 西方av在线 | 亚洲涩涩网 | 国产免费一区二区三区四区五区 | 国 产 黄 色 大 片 | 成人久久精品 | 国产va在线观看 | 欧美三级三级三级爽爽爽 | 欧美伦理影院 | 中文字幕一区在线 | 影音先锋丝袜制服 | 精品少妇人妻av一区二区三区 | 蜜臀人妻四季av一区二区不卡 | 国产香蕉精品视频 | 污污网站在线免费观看 | 四虎影视最新网址 | 久久精品欧美日韩精品 | 欧美日韩xxxx| 日韩亚洲天堂 | 91玉足脚交嫩脚丫在线播放 | 夜夜草天天草 | 国产乱论 | 日韩毛片一区二区三区 | 狠狠干一区| 国产美女视频免费观看下载软件 | 小香蕉影院| 黄色1级大片 | 日韩美女视频19 | 九九在线视频 | 欧美一区二区免费视频 | 亚洲天堂123 | 日韩女优在线播放 | 日本久久不卡 | 亚洲免费大片 | 久久国产视频网 | 操女人免费视频 | av网天堂 | 极度诱惑香港电影完整 | 夜夜夜网 | 国产激情视频一区二区三区 | 欧美激情在线观看视频 | 999精品视频在线观看 | 97爱爱视频| 激情爱爱网| 一区免费 | 欧美性色网站 | 国产av无码专区亚洲av毛网站 | 久久久久久久久久久综合 | 丰满人妻一区二区三区四区53 | 亚洲国产精品18久久久久久 | 成人区人妻精品一区二 | 美女午夜视频 | 国产综合视频一区 | 一级黄色毛毛片 | 国产视频一二三四区 | 国产精品久久毛片 | 红桃视频一区 | a中文字幕| 亚洲欧美激情图片 | 亚洲精华液一区二区 | 一本久道久久综合 | 操极品美女 | 天天爱夜夜操 | 超碰免费97 | 狠狠爱成人 | 久久免费播放视频 | 日本一区免费视频 | 国产亚洲视频一区 | 国产 福利 在线 | 国产a网| 免费中文字幕日韩 | 久久精品一区二区免费播放 | 少妇人妻好深好紧精品无码 | 欧洲性生活视频 | 成人mv在线观看 | 黄一区二区三区 | 欧美做受高潮中文字幕 |