C++|Java混合实验-java搭建get方法靶场,Qt发送请求获取数据
目录
背景
因为最近想进一步学习http协议,想从QNetworkAccessManager中,但访问其他网站获取的数据,太过于复杂,不便于个人的实验,在此,本人使用Java搭建了一个get方法的靶场,来学习QNetworkAccessManager的使用
演示
web网站如下:
如果输入了正确的QQ号:
如果输入了错误的QQ号:
在此使用Qt,输入存在的QQ号
再次输入不存在的QQ号:
在此抓一下包:
发送Get请求的封包:
此处的I am fine, fuck you是Qt发送的请求
服务器那边回的包:
java web源码
java源码结构如下:
源码如下:
DataSource.java
package my;
import java.util.ArrayList;
public class DataSource {
ArrayList<Record> m_records = new ArrayList<Record>();
public DataSource(){
m_records.add(new Record("XiaoMing", "10086"));
m_records.add(new Record("XiaoHong", "10087"));
m_records.add(new Record("XiaoGang", "10088"));
}
public Record query(String qq){
for(Record e : m_records){
if(e.qq.equals(qq)){
return e;
}
}
return null;
}
public class Record {
public String name = "";
public String qq = "0000";
public Record(String name, String qq){
this.name = name;
this.qq = qq;
}
}
}
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form method="get" action="query.jsp" >
输入QQ号
<input type="text" name="qq" />
<input type="submit" value="提交" />
</form>
</body>
</html>
query.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'query.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%@ page import="my.*" %>
<%
String qq = request.getParameter("qq");
DataSource db = new DataSource();
DataSource.Record result = db.query(qq);
if(result == null)
{
out.print("<p> 不存在此记录 </p> ");
}
else
{
out.print("<p> 姓名: " + result.name + ", QQ: " + result.qq + "</p>");
}
%>
</body>
</html>
Qt端源码
Qt程序结构如下:
widget.ui如下:
源码如下:
NetworkAccessManagerDemo.pro
QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = NetworkAccessManagerDemo
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += main.cpp\
widget.cpp
HEADERS += widget.h
FORMS += widget.ui
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
class QNetworkAccessManager;
class QNetworkReply;
QT_END_NAMESPACE
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected slots:
void replyFinished(QNetworkReply *reply);
void netWorkReplyLoadProgress(qint64 received, qint64 total);
void deleteNetWorkReply();
void httpRead();
void submitBtnClicked();
private:
Ui::Widget *ui;
QNetworkAccessManager *m_manager;
QNetworkReply *m_netWorkReply;
};
#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 <QNetworkAccessManager>
#include <QNetworkReply>
#include <QDebug>
#include <QNetworkReply>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("**** IT1995");
m_manager = new QNetworkAccessManager(this);
connect(m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
connect(ui->submitPushButton, SIGNAL(clicked(bool)), this, SLOT(submitBtnClicked()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::replyFinished(QNetworkReply *reply)
{
qDebug() << "replyFinished called!";
//qDebug() << "reply->readAll():" << QString::fromUtf8(reply->readAll());
//qDebug() << reply->readAll();
ui->plainTextEdit->appendHtml(reply->readAll());
m_netWorkReply->deleteLater(); //此列子中 m_netWorkReply->deleteLater(); 与 delete m_netWorkReply; 没有什么区别
}
void Widget::netWorkReplyLoadProgress(qint64 received, qint64 total)
{
//qDebug() << "received:" << received << " total:" << total;
}
void Widget::deleteNetWorkReply()
{
qDebug() << "deleteNetWorkReply called!" << endl;
}
void Widget::httpRead()
{
//qDebug() << m_netWorkReply->readAll();
}
void Widget::submitBtnClicked()
{
QString qq = ui->QQLineEdit->text();
QString url = QString("http://47.101.40.99:8080/GetPostDemo/query.jsp?qq=%1")
.arg(qq);
QNetworkRequest request;
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "I am fine, fuck you");
m_netWorkReply = m_manager->get(request);
connect(m_netWorkReply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(netWorkReplyLoadProgress(qint64,qint64)));
connect(m_netWorkReply, SIGNAL(readyRead()), this, SLOT(httpRead()));
}