国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt+QtWebApp開發(fā)筆記(四):http服務(wù)器使用Session和Cookie實(shí)現(xiàn)用戶密碼登錄和注銷功能

這篇具有很好參考價(jià)值的文章主要介紹了Qt+QtWebApp開發(fā)筆記(四):http服務(wù)器使用Session和Cookie實(shí)現(xiàn)用戶密碼登錄和注銷功能。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

??前面實(shí)現(xiàn)了基礎(chǔ)的跳轉(zhuǎn),那么動(dòng)態(tài)交互中登錄是常用功能。
??本篇實(shí)現(xiàn)一個(gè)動(dòng)態(tài)交互的簡單登錄和注銷功能,在Qt中使用Session和Cookie技術(shù)。

?

Demo

??Qt+QtWebApp開發(fā)筆記(四):http服務(wù)器使用Session和Cookie實(shí)現(xiàn)用戶密碼登錄和注銷功能

下載地址

??鏈接:https://pan.baidu.com/s/1nkmsHgr-11Khe9k6Ntyf_g?pwd=1234

?

Html處理用戶輸入Session與Cookie

表單登錄submit

??Web應(yīng)用程序通常處理用戶輸入。將開發(fā)一個(gè)登錄表單,看看進(jìn)展如何。
創(chuàng)建一個(gè)名為LoginController的新類。同樣,它是從HttpRequestHandl派生的

logincontroller.h:

#ifndef LOGINCONTROLLER_H
#define LOGINCONTROLLER_H

#include "httprequesthandler.h"

using namespace stefanfrings;

class LoginController : public HttpRequestHandler {
    Q_OBJECT
public:
    LoginController(QObject* parent=0);
    void service(HttpRequest& request, HttpResponse& response);
};

#endif // LOGINCONTROLLER_H

logincontroller.cpp:

#include "logincontroller.h"

LoginController::LoginController(QObject* parent)
    :HttpRequestHandler(parent) {
    // empty
}

void LoginController::service(HttpRequest &request, HttpResponse &response) {
    QByteArray username=request.getParameter("username");
    QByteArray password=request.getParameter("password");

    qDebug("username=%s",username.constData());
    qDebug("password=%s",password.constData());

    response.setHeader("Content-Type", "text/html; charset=UTF-8");
    response.write("<html><body>");

    if (username=="test" and password=="hello") {
        response.write("Yes, correct");
    }
    else {
        response.write("<form method='POST' action='/login'>");
        if (!username.isEmpty()) {
            response.write("No, that was wrong!<br><br>");
        }
        response.write("Please log in:<br>");
        response.write("Name:  <input type='text' name='username'><br>");
        response.write("Password: <input type='password' name='password'><br>");
        response.write("<input type='submit'>");
        response.write("</form");
    }

    response.write("</body></html>",true);
}

??(PS:html代表是提交表單)
??將這個(gè)新控制器添加到請(qǐng)求映射器中,修改requestmapper.h:

#ifndef REQUESTMAPPER_H
#define REQUESTMAPPER_H

#include "httprequesthandler.h"
#include "helloworldcontroller.h"
#include "listdatacontroller.h"
#include "logincontroller.h"

class RequestMapper : public HttpRequestHandler {
    Q_OBJECT
public:
    RequestMapper(QObject* parent=0);
    void service(HttpRequest& request, HttpResponse& response);
private:
    HelloWorldController helloWorldController;
    ListDataController listDataController;
    LoginController loginController;
};

#endif // REQUESTMAPPER_H

??修改requestmapper.cpp(切入了/login,調(diào)用loginController):

#include "requestmapper.h"

RequestMapper::RequestMapper(QObject* parent)
    : HttpRequestHandler(parent) {
    // empty
}

void RequestMapper::service(HttpRequest& request, HttpResponse& response) {
    QByteArray path=request.getPath();
    qDebug("RequestMapper: path=%s",path.data());

    if (path=="/" || path=="/hello") {
        helloWorldController.service(request, response);
    }
    else if (path=="/list") {
        listDataController.service(request, response);
    }
    else if (path=="/login") {
        loginController.service(request, response);
    }
    else {
        response.setStatus(404,"Not found");
        response.write("The URL is wrong, no such document.");
    }

    qDebug("RequestMapper: finished request");
}

??運(yùn)行程序并打開URLhttp://localhost:8080/login.將看到以下表格:

??Qt+QtWebApp開發(fā)筆記(四):http服務(wù)器使用Session和Cookie實(shí)現(xiàn)用戶密碼登錄和注銷功能
??嘗試使用錯(cuò)誤的名稱和密碼登錄。然后瀏覽器顯示錯(cuò)誤消息“That was wrong”,并提示重試。如果輸入了正確的憑據(jù)(用戶名“test”和密碼“hello”),則會(huì)收到成功消息。

??HTML表單定義了兩個(gè)名為“username”和“password”的輸入字段??刂破魇褂胷equest.getParameter()來獲取這些值。

??當(dāng)參數(shù)為空或傳入的HTTP請(qǐng)求中沒有這樣的參數(shù)時(shí),Request.getParameter()?返回一個(gè)空的QByteArray。后一種情況發(fā)生在打開URL時(shí)http://localhost:8080/login開始只有當(dāng)用戶單擊提交按鈕時(shí),表單字段才會(huì)從web瀏覽器發(fā)送到web服務(wù)器。

??如果需要區(qū)分空字段和缺失字段,那么可以使用request.getParameterMap(),然后檢查所需參數(shù)是否在返回的映射中。

??作為表單的替代方案,參數(shù)也可以作為URL的一部分進(jìn)行傳輸。例如,也可以通過打開URL登錄http://localhost:8080/login?username=test&password=hello.

??在URL中使用某些特殊字符時(shí),必須將其編碼為轉(zhuǎn)義序列。例如,如果用戶名是“Stefan Frings”,那么必須寫http://localhost:8080/login?username=Stefan%20Frings&password=hello.HttpRequest類會(huì)自動(dòng)將其解碼回原始形式“Stefan Frings”。

??如果需要將字符串編碼為URL格式,可以使用QUrl類。

服務(wù)器本地會(huì)話session

??(PS:session和cookie是一起搭配使用的,cookie存在本地 session可以拿到cookie來判斷是否登錄了,等一些已有的狀態(tài))
??下一個(gè)合乎邏輯的步驟是處理會(huì)話數(shù)據(jù)。這意味著,將當(dāng)前用戶的數(shù)據(jù)保存在某個(gè)地方,并在后續(xù)請(qǐng)求中使用這些數(shù)據(jù)。將存儲(chǔ)的第一個(gè)數(shù)據(jù)是用戶的姓名和登錄時(shí)間。
??QtWebApp使用隱藏的cookie來識(shí)別用戶。
??必須在控制會(huì)話存儲(chǔ)類的配置文件webapp1.ini中添加一個(gè)新的部分:

[sessions]
expirationTime=3600000
cookieName=sessionid
;cookieDomain=mydomain.com
cookiePath=/
cookieComment=Identifies the user

??過期時(shí)間定義從內(nèi)存中刪除未使用的會(huì)話后的毫秒數(shù)。當(dāng)用戶在該時(shí)間之后返回時(shí),他的會(huì)話將丟失,因此他必須再次登錄。

  • expirationTime:保存時(shí)間,實(shí)際上從后面的cookie截圖可以看到是3600000ms,則是3600秒一小時(shí)的時(shí)間過期,這個(gè)保存后的默認(rèn)過期時(shí)間。
    ??Qt+QtWebApp開發(fā)筆記(四):http服務(wù)器使用Session和Cookie實(shí)現(xiàn)用戶密碼登錄和注銷功能
  • sessionid:cookie名稱可以是任意名稱,但通常使用名稱“sessionid”。有些負(fù)載均衡器依賴于這個(gè)名稱,所以除非有充分的理由,否則不應(yīng)該更改它。
  • cookieDomain:每個(gè)cookie總是綁定到一個(gè)域。由google.com生成的cookie只發(fā)送到該域上的服務(wù)器。如果將cookieDomain參數(shù)留空或?qū)⑵渥⑨尩?,則該參數(shù)將由web瀏覽器自動(dòng)設(shè)置??梢灾付硪粋€(gè)域名,但不知道男人為什么要這么做。所以,除非知道自己在做什么,否則就把它空著。
  • cookiePath:cookie路徑可用于將cookie限制在的域的一部分。如果將cookiePath更改為/my/very/cool/online/shop,則瀏覽器將僅針對(duì)以該路徑開頭的頁面將cookie發(fā)送到的服務(wù)器。默認(rèn)值為“/”,這意味著cookie對(duì)域中的所有網(wǎng)站都有效。
  • cookieComment:cookieComment是一些網(wǎng)絡(luò)瀏覽器在cookie管理屏幕中顯示的文本。
    ??需要HttpSessionStore類的一個(gè)實(shí)例,整個(gè)程序都可以訪問該實(shí)例,因此可以在全局空間中訪問。因此,創(chuàng)建了兩個(gè)新文件,第一個(gè)是global.h:
#ifndef GLOBAL_H
#define GLOBAL_H

#include "httpsessionstore.h"

using namespace stefanfrings;

extern HttpSessionStore* sessionStore;

#endif // GLOBAL_H

??global.cpp:

#include "global.h"

HttpSessionStore* sessionStore;

??現(xiàn)在有了一個(gè)名為“sessionStore”的全局靜態(tài)指針,整個(gè)程序可以通過包含global.h文件來訪問該指針。讓加載新的配置設(shè)置并初始化sessionStore。
??main.cpp中的更改:

#include "global.h"

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QString configFileName=searchConfigFile();

    // Session store
    QSettings* sessionSettings=new QSettings(configFileName,QSettings::IniFormat,&app);
    sessionSettings->beginGroup("sessions");
    sessionStore=new HttpSessionStore(sessionSettings,&app);

    // HTTP server
    QSettings* listenerSettings=new QSettings(configFileName,QSettings::IniFormat,&app);
    listenerSettings->beginGroup("listener");
    new HttpListener(listenerSettings,new RequestMapper(&app),&app);

    return app.exec();
}

??請(qǐng)注意,main.cpp現(xiàn)在加載配置文件兩次。sessionSettings對(duì)象選擇“sessions”部分,而listenerSettings選擇“l(fā)istener”部分。對(duì)于每個(gè)部分,需要一個(gè)單獨(dú)的QSettings實(shí)例,否則這些部分可能會(huì)混淆。
??既然已經(jīng)為會(huì)話數(shù)據(jù)創(chuàng)建了一個(gè)存儲(chǔ),就可以開始使用它了。添加到logincontroller.cpp:文章來源地址http://www.zghlxwxcb.cn/news/detail-463019.html

#include <QTime>
#include "logincontroller.h"
#include "global.h"

LoginController::LoginController(QObject* parent)
    :HttpRequestHandler(parent) {
    // empty
}

void LoginController::service(HttpRequest &request, HttpResponse &response) {
    HttpSession session=sessionStore->getSession(request,response,true);
    QByteArray username=request.getParameter("username");
    QByteArray password=request.getParameter("password");

    qDebug("username=%s",username.constData());
    qDebug("password=%s",password.constData());

    response.setHeader("Content-Type", "text/html; charset=UTF-8");
    response.write("<html><body>");

    if (session.contains("username")) {
        QByteArray username=session.get("username").toByteArray();
        QTime logintime=session.get("logintime").toTime();
        response.write("You are already logged in.<br>");
        response.write("Your name is: "+username+"<br>");
        response.write("You logged in at: "+logintime.toString("HH:mm:ss")+"<br>");
    }
    else {
        if (username=="test" and password=="hello") {
            response.write("Yes, correct");
            session.set("username",username);
            session.set("logintime",QTime::currentTime());
        }
        else {
            response.write("<form method='POST' action='/login'>");
            if (!username.isEmpty()) {
                response.write("No, that was wrong!<br><br>");
            }
            response.write("Please log in:<br>");
            response.write("Name:  <input type='text' name='username'><br>");
            response.write("Password: <input type='password' name='password'><br>");
            response.write("<input type='submit'>");
            response.write("</form")

到了這里,關(guān)于Qt+QtWebApp開發(fā)筆記(四):http服務(wù)器使用Session和Cookie實(shí)現(xiàn)用戶密碼登錄和注銷功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Qt+QtWebApp開發(fā)筆記(六):http服務(wù)器html實(shí)現(xiàn)靜態(tài)相對(duì)路徑調(diào)用第三方j(luò)s文件

    Qt+QtWebApp開發(fā)筆記(六):http服務(wù)器html實(shí)現(xiàn)靜態(tài)相對(duì)路徑調(diào)用第三方j(luò)s文件

    若該文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明原文出處 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131244269 紅胖子網(wǎng)絡(luò)科技博文大全:開發(fā)技術(shù)集合(包含Qt實(shí)用技術(shù)、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機(jī)、軟硬結(jié)合等等)持續(xù)更新中… 上一篇:《Qt+QtWebApp開發(fā)筆記(五

    2024年02月13日
    瀏覽(99)
  • QtWebApp介紹、下載和搭建http輕量級(jí)服務(wù)器Demo

    QtWebApp介紹、下載和搭建http輕量級(jí)服務(wù)器Demo

    QtWepApp是一個(gè)C++中的HTTP服務(wù)器庫,其靈感來自Java Servlet。適用于Linux、Windows、Mac OS和Qt Framework支持的許多其他操作系統(tǒng)。 ??QtWebApp包含以下組件: ? HTTP(S)1.0和1.1服務(wù)器 ? 模板引擎 ? 緩沖記錄器 ??這些組件可以相互獨(dú)立地使用。一個(gè)非常小的用法示例: 官方: http:

    2024年02月12日
    瀏覽(35)
  • QtWebApp開發(fā)https服務(wù)器,完成客戶端與服務(wù)器基于ssl的雙向認(rèn)證,純代碼操作

    引言:所謂http協(xié)議,本質(zhì)上也是基于TCP/IP上服務(wù)器與客戶端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn),web開發(fā)中常用的http server有apache和nginx。Qt程序作為http client可以使用QNetworkAccessManager很方便的進(jìn)行http相關(guān)的操作。 Qt本身并沒有http server相關(guān)的庫 ,也許是因?yàn)楹苌儆羞@種需求吧。但是實(shí)際開發(fā)中

    2024年02月14日
    瀏覽(26)
  • Flask框架小程序后端分離開發(fā)學(xué)習(xí)筆記《2》構(gòu)建基礎(chǔ)的HTTP服務(wù)器

    Flask框架小程序后端分離開發(fā)學(xué)習(xí)筆記《2》構(gòu)建基礎(chǔ)的HTTP服務(wù)器

    Flask是使用python的后端,由于小程序需要后端開發(fā),遂學(xué)習(xí)一下后端開發(fā)。本節(jié)提供一個(gè)構(gòu)建簡單的本地服務(wù)器的代碼,仔細(xì)看注釋,學(xué)習(xí)每一步的流程,理解服務(wù)器接收請(qǐng)求,回復(fù)響應(yīng)的基本原理。 代碼效果,運(yùn)行之后,在瀏覽器輸入:localhost:2000 總結(jié) 1.導(dǎo)入socket庫:這個(gè)庫

    2024年01月18日
    瀏覽(26)
  • linux高并發(fā)web服務(wù)器開發(fā)(web服務(wù)器)18_函數(shù)解析http請(qǐng)求, 正則表達(dá)式,sscanf使用,http中數(shù)據(jù)特殊字符編碼解碼

    linux高并發(fā)web服務(wù)器開發(fā)(web服務(wù)器)18_函數(shù)解析http請(qǐng)求, 正則表達(dá)式,sscanf使用,http中數(shù)據(jù)特殊字符編碼解碼

    pdf詳情版 編寫函數(shù)解析http請(qǐng)求 ○ GET /hello.html HTTP/1.1rn ○ 將上述字符串分為三部分解析出來 編寫函數(shù)根據(jù)文件后綴,返回對(duì)應(yīng)的文件類型 sscanf - 讀取格式化的字符串中的數(shù)據(jù) ○ 使用正則表達(dá)式拆分 ○ [^ ]的用法 通過瀏覽器請(qǐng)求目錄數(shù)據(jù) ○ 讀指定目錄內(nèi)容 ? opendir ?

    2024年02月16日
    瀏覽(26)
  • 【Qt-4】QT基于qhttp-server搭建http服務(wù)器

    【Qt-4】QT基于qhttp-server搭建http服務(wù)器

    寫在前面 :雖然qhttp-server編譯成功,已生成dll庫,但在使用過程中,仍出現(xiàn)無法打開文件: “QtSslServer/QtSslServer”的問題,在多次解決無果后,決定放棄qhttp-server,選擇了QWebAPP,望知道的大佬可以幫忙解答一下,感謝~~ 一、環(huán)境搭建 1、下載及解壓源文件 下載QtHttpServer源碼,

    2024年02月08日
    瀏覽(19)
  • QT實(shí)現(xiàn)客戶端服務(wù)器HTTP(get請(qǐng)求、post請(qǐng)求)

    QT實(shí)現(xiàn)客戶端服務(wù)器HTTP(get請(qǐng)求、post請(qǐng)求)

    服務(wù)器代碼如下: QtHttpForS.h QtHttpForS.cpp main.cpp QtHttpForS.ui 客戶端代碼: QtHttpForC.h QtHttpForC.cpp mian.cpp QtHttpForC.ui 程序運(yùn)行效果: GET請(qǐng)求: POST請(qǐng)求: POST請(qǐng)求使用postman測試: 注意: 可以發(fā)現(xiàn),在使用postman進(jìn)行POST請(qǐng)求發(fā)送時(shí),服務(wù)器接收到的請(qǐng)求頭與QTSocket的POST請(qǐng)求的請(qǐng)求頭

    2023年04月22日
    瀏覽(23)
  • 用Java開發(fā)HTTP代理服務(wù)器

    HTTP代理服務(wù)器是一種網(wǎng)絡(luò)應(yīng)用,它充當(dāng)位于客戶端和目標(biāo)服務(wù)器之間的中間節(jié)點(diǎn),將客戶端發(fā)出的HTTP請(qǐng)求轉(zhuǎn)發(fā)給目標(biāo)服務(wù)器,并將目標(biāo)服務(wù)器返回的HTTP響應(yīng)內(nèi)容回傳給客戶端。通過使用代理服務(wù)器,客戶端可以避免直接訪問目標(biāo)服務(wù)器,從而更加安全地訪問互聯(lián)網(wǎng)資源。

    2024年02月16日
    瀏覽(38)
  • 〖Web全棧開發(fā)③〗—HTTP協(xié)議和靜態(tài)web服務(wù)器

    〖Web全棧開發(fā)③〗—HTTP協(xié)議和靜態(tài)web服務(wù)器

    ??????個(gè)人簡介:以山河作禮。 ??????: Python領(lǐng)域新星創(chuàng)作者,CSDN實(shí)力新星認(rèn)證,阿里云社區(qū)專家博主 ????:Web全棧開發(fā)專欄:《Web全棧開發(fā)》免費(fèi)專欄,歡迎閱讀! TCP (Transmission Control Protocol) 是在互聯(lián)網(wǎng)協(xié)議(IP)上的一種基于連接(面向連接)的傳輸層協(xié)議 。數(shù)據(jù)

    2024年02月05日
    瀏覽(21)
  • HTTP服務(wù)器——tomcat的安裝和使用

    HTTP服務(wù)器——tomcat的安裝和使用

    前面我們已經(jīng)學(xué)習(xí)了應(yīng)用層協(xié)議 HTTP 協(xié)議和 HTTP 的改進(jìn)版——HTTPS,這些協(xié)議是我們?cè)趯懪c服務(wù)器相關(guān)的代碼的時(shí)候息息相關(guān)的,而在現(xiàn)實(shí)開發(fā)網(wǎng)站的時(shí)候,我們就需要用到 HTTP 服務(wù)器,自己手寫出來一個(gè)服務(wù)器是比較麻煩的,所以在咱們Java圈子中有一個(gè)現(xiàn)成的比較知名的

    2024年02月04日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包