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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++|Java混合实验-Spring Boot获取客户端操作系统,浏览器,Ip等信息,Qt端展示

發布時間:2025/3/15 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++|Java混合实验-Spring Boot获取客户端操作系统,浏览器,Ip等信息,Qt端展示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

?

概述

演示

源碼


?

概述

這里用Spring Boot控制"/"和"index.html"請求,獲取客戶端http的信息;

Qt端使用QML和C++混合編程方式,C++控制業務,QML做頁面展示;

?

演示

首先來個動態圖:

然后,然后就沒有然后了,

差不多就是這種現象,可以識別谷歌,和火狐瀏覽器,

Windows和Linux操作系統,主要是根據HTTP包的user-agent這個屬性。

?

源碼

Java端結構如下:

源碼如下:

HelloController.java

package getsomeinfo.demo.controller;import getsomeinfo.demo.judgment.Judge; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Enumeration; import java.util.List; import java.util.Map;@Controller public class HelloController {@AutowiredJdbcTemplate jdbcTemplate;@AutowiredHttpServletRequest httpServletRequest;@ResponseBody@GetMapping({"/", "/index.html"})public String index(){//List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from someInfo");Enumeration<String> headerNames = httpServletRequest.getHeaderNames();String allInfo = "";while (headerNames.hasMoreElements()){String header = headerNames.nextElement();allInfo += header + ": ";allInfo += httpServletRequest.getHeader(header) + "\n";}String osAndBrower = httpServletRequest.getHeader("user-agent");String os = Judge.whatOS(osAndBrower);String brower = Judge.whatBrower(osAndBrower);System.out.println(os + ":" + brower);SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");df.format(new Date());String sqlCmd = "insert into someInfo(os, brower, time, alldata) values('"+ os + "', '" + brower + "', '" + df.format(new Date()) + "', '" + allInfo + "')";System.out.println(sqlCmd);//存到數據庫里面jdbcTemplate.execute(sqlCmd);return "業務繁忙,告辭,告辭!";} }

Jude.java

package getsomeinfo.demo.judgment;public class Judge {//判斷是啥操作系統public static String whatOS(final String str){String osStr = "未知";//這里就簡單判斷下if(str.contains("Windows")){osStr = "Windows";}else if(str.contains("Linux")){osStr = "Linux";}else{}return osStr;}//判斷是啥瀏覽器-簡單判斷下public static String whatBrower(final String str){String browerStr = "未知";if(str.contains("Chrome")){browerStr = "Chrome";}else if(str.contains("Firefox")){browerStr = "Firefox";}else{}return browerStr;} }

application.yml

spring:datasource:username: rootpassword : 123456url: jdbc:mysql://192.168.164.141:3306/jdbcdriver-class-name: com.mysql.jdbc.Driverserver:port: 8888

porn.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.19.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>GetSomeInfo</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

?

C++的Qt端

結構如下:

源碼如下:

mytableviewmodel.h

#ifndef MYTABLEVIEWMODEL_H #define MYTABLEVIEWMODEL_H#include <QAbstractTableModel>class MyTableViewModel: public QAbstractTableModel {Q_OBJECT public:MyTableViewModel();int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;Q_INVOKABLE void addItem(QString one, QString two, QString three, QString four, QString five);Q_INVOKABLE void Del();Q_INVOKABLE void Refresh();private:QVector<QVector<QString>> m_aryData;};#endif // MYTABLEVIEWMODEL_H

widget.h

#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> #include <QVector>QT_BEGIN_NAMESPACE class QQuickView; class MyTableViewModel; class QSqlQuery; class QTimer; QT_END_NAMESPACEnamespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();protected:void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;bool connectMySQL();QVector<QStringList> selectAppropriateData(const QString &cmd);protected slots:void flushText();private:Ui::Widget *ui;QQuickView *m_quickView;QWidget *m_quickWidget;MyTableViewModel *m_model;QSqlDatabase m_db;QSqlQuery *m_query;QTimer *m_timer; };#endif // WIDGET_H

main.cpp

#include "widget.h" #include "mytableviewmodel.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

mytableviewmodel.cpp

#include "mytableviewmodel.h"MyTableViewModel::MyTableViewModel(): QAbstractTableModel(NULL) {}int MyTableViewModel::rowCount(const QModelIndex &parent) const {Q_UNUSED(parent)return m_aryData.size(); }int MyTableViewModel::columnCount(const QModelIndex &parent) const {Q_UNUSED(parent)return 3; }QVariant MyTableViewModel::data(const QModelIndex &index, int role) const {return m_aryData[index.row()][role]; }QHash<int, QByteArray> MyTableViewModel::roleNames() const {QHash<int, QByteArray> roles;roles[0] = "1";roles[1] = "2";roles[2] = "3";roles[3] = "4";roles[4] = "5";return roles; }void MyTableViewModel::addItem(QString one, QString two, QString three, QString four, QString five) {beginInsertRows(QModelIndex(), m_aryData.size(),m_aryData.size());QVector<QString> list;list << one << two << three << four << five;m_aryData << list;endInsertRows(); }void MyTableViewModel::Del() {if(m_aryData.size() <= 0) return;for(int i = 0; i < m_aryData.size(); i++){beginRemoveRows(QModelIndex(), m_aryData.size() - 1, m_aryData.size() - 1);}m_aryData.clear();endRemoveRows(); }void MyTableViewModel::Refresh() {beginResetModel();endResetModel(); }

widget.cpp

#include "widget.h" #include "ui_widget.h" #include "mytableviewmodel.h" #include <QQmlApplicationEngine> #include <QQmlComponent> #include <QDateTime> #include <QQmlContext> #include <QQuickView> #include <QSqlQuery> #include <QResizeEvent> #include <QDebug> #include <QTimer>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);connectMySQL();m_quickView = new QQuickView;m_timer = new QTimer(this);m_model = new MyTableViewModel;m_quickView->engine()->rootContext()->setContextProperty("theModel", m_model);m_quickView->setResizeMode(QQuickView::SizeRootObjectToView);m_quickView->setSource(QUrl("qrc:/main.qml"));m_quickWidget = QWidget::createWindowContainer(m_quickView);m_quickWidget->setParent(ui->widget);connect(m_timer, SIGNAL(timeout()), this, SLOT(flushText()));m_timer->start(500);this->setWindowTitle("CSDN IT1995"); }Widget::~Widget() {delete ui;delete m_quickView;delete m_model; }void Widget::resizeEvent(QResizeEvent *event) {Q_UNUSED(event);m_quickWidget->setFixedSize(ui->widget->size());QWidget::resizeEvent(event); }bool Widget::connectMySQL() {m_db = QSqlDatabase::addDatabase("QMYSQL");m_query = new QSqlQuery(m_db);m_db.setHostName("192.168.164.141");m_db.setPort(3306);m_db.setDatabaseName("mysql");m_db.setUserName("root");m_db.setPassword("123456");if(!m_db.open()){qDebug() << "error";return false;}return true; }QVector<QStringList> Widget::selectAppropriateData(const QString &cmd) {QVector<QStringList>listVec;if(!m_query->exec(cmd) || m_query->size() == 0){return listVec;}while(m_query->next()){QStringList list;for(int i = 0; i < 5; i++){ //這里偷懶了,把5寫死了!if(i == 3){list << m_query->value(i).toDateTime().toString("yyyy-MM-dd HH:mm:ss");continue;}list << m_query->value(i).toString();}listVec.append(list);}return listVec; }void Widget::flushText() {m_model->Del();QVector<QStringList> listVec = selectAppropriateData("select * from jdbc.someInfo");for(int i = 0; i < listVec.size(); i++){m_model->addItem(listVec[i][0].toUtf8(), listVec[i][1].toUtf8(), listVec[i][2].toUtf8(), listVec[i][3].toUtf8(), listVec[i][4].toUtf8());}m_model->Refresh(); }

widget.ui

main.qml

import QtQuick 2.8 import QtQuick.Controls 2.1Item {visible: trueMyTableView{id: myTableViewheight: parent.heightwidth: parent.widthfocus: falsetableView.itemDelegate:Rectangle {TextField{id: textFieldheight: 25text: styleData.value}}tableView.rowDelegate: Rectangle {height: 25}} }

MyTableView.qml

import QtQuick 2.8 import QtQuick.Controls 1.4TableView {property alias tableView: tableViewid: tableViewTableViewColumn {title: "id"; role: "1"; width: 120}TableViewColumn {title: "操作系統"; role: "2"; width: 120}TableViewColumn {title: "瀏覽器"; role: "3"; width: 120}TableViewColumn {title: "訪問時間"; role: "4"; width: 120}TableViewColumn {title: "所有數據"; role: "5"; width: 120}model: theModel }

MySQL數據庫

總結

以上是生活随笔為你收集整理的C++|Java混合实验-Spring Boot获取客户端操作系统,浏览器,Ip等信息,Qt端展示的全部內容,希望文章能夠幫你解決所遇到的問題。

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