目录
基本概念
在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