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

目录

 

 

基本概念

博主例子


 

基本概念

在HTTP服务器中,响应头可以设置Cookie;

              1. 通过Set-Cookie设置;

              2.  下次请求头会自动带上;

              3. Cookie是键值对,可以设置多个;

 

Cookie属性:

              1. 通过max-age和expires设置过期时间;

              2. Secure只在https的时候发送;

              3. HttpOnly无法通过document.cookie访问

 

HttpOnly是为了避免CSRF攻击,网页注入脚本,或者使用域名获取用户Cookie所以要禁止重要的数据,通过JavaScript进行访问,能够保证用户数据安全;

 

下面来说明下Cookie和Session

              1. Cookie 不等于 Session;

              2. Session 有很多种实现方法;

              3. 其中一个就是用Cookie 来保存 Session;

 

 

博主例子

如下伪代码:设置多个Cookie

 

运行截图如下:

其中对应的代码为:

这里有一个max-age。改变服务器为wuCookie

如下:

10s后,在此发起请求,看看浏览器的请求头!

可以看到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_NAMESPACE

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值