Cordova移動應用對云端服務器數據庫的跨域訪問

Cordova移動應用對云端服務器數據庫的跨域訪問

當基于類似 Cordova這樣的跨平臺開發框架進行移動應用的跨平臺開發時,往往需要訪問部署在公網云端服務器上的數據庫,這時就涉及到了跨域數據訪問的問題。

文章目錄

  • Cordova移動應用對云端服務器數據庫的跨域訪問
  • 一、跨域訪問的概念
  • 二、跨域訪問在Cordova中的實現實例
    • 1、運行環境
    • 2、實例


一、跨域訪問的概念

跨域(CORS, Cross-Origin Resource Sharing)指的是一個源(origin)的網頁或應用,訪問另一個源上的資源或接口時,就發生了“跨域”。跨域概念的起源是由于同源策略(Same-origin_policy),該策略是1995年由 Netscape 公司引入瀏覽器的最核心也是最基本的安全策略。同源指域名(IP)、協議、端口需要相同才能完成彼此資源的訪問和讀寫。而不同源的客戶端腳本在沒有明確授權的情況下,不允許讀寫對方的資源,瀏覽器會報異常:“拒絕訪問”。主要目的是避免在客戶不知情的情況下出現安全問題。
因此,跨域只要存在不同IP地址、不同域名(包括子域名)、不同端口地址,都屬于“跨域”訪問。例如:

跨域訪問原因
http://www.a.com/index.html 調用 http://www.b.com/server.php主域名不同
http://www.a.com/index.html 調用 http://www.b.com/server.php子域名不同
http://www.a.com/index.html 調用 http://www.b.com/server.php子域名不同
http://www.a.com:80/index.html 調用 http://www.a.com:8080/index.html端口不同
http://www.a.com/index.html 調用 https://www.a.com/server.php協議不同

然而,從上面實例可見,跨域訪問的需求在實際應用中普遍存在,特別是在當今互聯網已成為基礎設施的情況下,例如:
1、集團公司或組織下,多個子域間的資源共享和訪問
2、客戶端和服務端之間的遠程資源交互和訪問
3、跨平臺開發需要將數據集中在公網服務器,而移動客戶端通過遠程完成數據的共享和并發。

在上述場景中,都涉及到跨不同域名、IP或端口的訪問。

二、跨域訪問在Cordova中的實現實例

1、運行環境

本實例的運行開發環境基于如下架構:

(1) 公網WWW服務器

IP地址假設為:10.10.10.111
www服務:apache
后端開發語言:php
數據庫:mysql(mariaDB)

(2) 前端開發工具
javascript+Html+css
cordova

2、實例

本實例實現基于cordova 編譯運行的跨平臺移動app,訪問公網10.10.10.1中安裝的數據庫中的users表,當用戶輸入username,userpassword后,選擇“新用戶注冊”,則向數據庫表中新增一條用戶,未選中,則查詢表中是否存在uname和upass分別等于用戶輸入的username和userpassword的記錄。

users表結構如下:
在這里插入圖片描述

生成庫的SQL語句:

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (`id` int(11) NOT NULL AUTO_INCREMENT,`uname` char(30) NOT NULL,`upass` varchar(30) DEFAULT NULL,`utype` tinyint(1) DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

(1)前端代碼

cordova工程中index.html內容如下:
其中使用了jqueryMobile,下載后需要放到www目錄下的lib目錄

<!--This is for mobile -->
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Web SQLite Test</title><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="stylesheet" href="lib/jquery.mobile-1.4.5.min.css" /><script src="lib/jquery-2.1.1.min.js"></script><script src="lib/jquery.mobile-1.4.5.min.js"></script><!--<script type="text/javascript" charset="utf-8" src="cordova.js">--></script><script type="text/javascript">$(document).ready(function() {$("#submitbtn").bind("click", function () {$.ajax({type: "post",url: "http://10.10.10.111/myUserlogin_Server/valid.php",//公網云服務器地址data: {username:$('#username').val(),password:$('#userpassword').val(),registerit:$("#newuser").prop("checked"),},datatype: "jsonp",success : onSuccess, error : onError });return false;});}); function onSuccess(data,status){ data = $.trim(data); //去掉前后空格 alert(data);} function onError(data,status){ //進行錯誤處理 console.info("網絡出錯");} </script>  </head><body><div data-role="page"><div data-role="header"><h1>系統登錄</h1></div><div data-role="content" class="ui-content"><form method="post" id="feedbackform"><div class="ui-field-contain"><label for="username">用戶名:</label><input type="text" name="username" id="username" placeholder="請輸入用戶名">       <label for="userpassword">&nbsp&nbsp 碼:</label><input type="password" name="userpassword" id="userpassword" placeholder="請輸入密碼"><label for="newuser">新用戶注冊</label><input type="checkbox" name="newuser" id="newuser" value="1"></div><input type="button" id="submitbtn" class="ui-btn ui-btn-a"  value="提交"></form><button id="ModifyRec" >取消</button><div id="database_results"></div></div>	 </body></html>

(2)后端代碼
在服務器中,安裝了apache+php的解釋器,并在htdocs中建立文件夾myUserlogin_Server,里面的valid.php用于根據前端提交的數據完成數據庫的相應操作。

<?php
header("Access-Control-Allow-Origin:*");//允許所有域名的腳本跨域訪問該資源,從安全角度建議設置更嚴格的權限
$user=$_POST["username"];
$pass=$_POST["password"];
$newuser=$_POST["registerit"];
/*echo '用戶名:'.$user;
echo '密碼:'.$pass;
echo '是否需注冊:'.$newuser;*/
// PDO方式連接
try {$conn = new PDO("mysql:host=localhost;dbname=cordovatestdb", '登錄用戶名', '登錄密碼');//   echo "連接mysql的test數據庫成功"; 
}
catch (PDOException $e) {  die('連接失敗:' . $e->getMessage());  }  
$conn->exec("set names 'utf8'");
if($newuser=='true')   //注冊新用戶{$sql = "SELECT id, uname, utype FROM users where uname=?";if (QueryDB($conn,$sql,array($user))!=null){//已有同名記錄echo "已經注冊過,直接登錄!"; } else {  //進行注冊,新增該用戶$sql = "INSERT INTO users (uname, upass, utype)VALUES (?, ?, 1)";$stmt = $conn->prepare($sql);$rs = $stmt->execute(array($user,$pass));if ($rs) {echo "按輸入的用戶名和密碼,注冊成功!";$sql = "SELECT id, uname, utype FROM users where uname=? and upass=?";$rows = QueryDB($conn,$sql,array($user,$pass));if ($rows!=null){//驗證注冊記錄是否保存成功print_r($rows);  //輸出記錄} else {echo "注冊失敗: " . $sql . "<br>" . $conn->error;}}}}
else{ //登錄$sql = "SELECT id, uname, utype FROM users where uname=? and upass=?";$rows = QueryDB($conn,$sql,array($user,$pass));if ($rows!=null){//登錄驗證記錄存在// 驗證用戶成功,輸出數據echo "登錄成功!";	print_r($rows); }else {echo "用戶名或者密碼錯誤!";}}
$conn = null; Function QueryDB($dbo,$sql,$paraStr)
{$stmt = $dbo->prepare($sql);$rs = $stmt->execute($paraStr);$rows = $stmt->fetchAll();  $row_count = $stmt->rowCount(); //記錄數if ($rs && $row_count>0)return $rows;else {return 0;}
}
?>

注意:前端代碼也可以直接采用javascript的fetch語句完成http請求。
參考代碼如下:

const apiURL = "https://10.10.10.111/valid.php"; // 你的PHP地址function login() {const username = document.getElementById("username").value;const userpassword = document.getElementById("userpassword").value;const registerit = document..getElementById("newuser").checked;fetch(apiURL, {method: "POST",headers: {"Content-Type": "application/json"},body: JSON.stringify({username: username,password: userpassword,registerit: registerit})}).then(response => response.json()).then(data => {if (data.success) {alert("登錄成功!");// 繼續處理登錄后的邏輯} else {alert("登錄失敗:" + data.message);}}).catch(error => {alert("請求出錯:" + error);});
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909164.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909164.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909164.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql知識點3--創建和使用數據庫

mysql知識點3–創建數據庫 創建數據庫 在MySQL中創建數據庫使用CREATE DATABASE語句。語法如下&#xff1a; CREATE DATABASE database_name;其中database_name為自定義的數據庫名稱。例如創建名為test_db的數據庫&#xff1a; CREATE DATABASE test_db;可以添加字符集和排…

林業資源多元監測技術守護綠水青山

在云南高黎貢山的密林中&#xff0c;無人機群正以毫米級精度掃描古樹年輪&#xff1b;福建武夷山保護區&#xff0c;衛星遙感數據實時追蹤著珍稀動植物的棲息地變化&#xff1b;海南熱帶雨林里&#xff0c;AI算法正從億萬條數據中預測下一場山火的風險……這些科幻場景&#xf…

一階/二階Nomoto模型(野本模型)為何“看不到”船速對回轉角速度/角加速度的影響?

提問 圖中的公式反映的是舵角和力矩之間的關系&#xff0c; 其中可以看到力矩&#xff08;可以理解為角加速度&#xff09;以及相應導致的回轉角速度和當前的舵速&#xff08;主要由船速貢獻&#xff09;有關&#xff0c;那么為什么一階Nomoto模型&#xff08;一階野本&#xf…

深入剖析 C++ 默認函數:拷貝構造與賦值運算符重載

目錄 1. 簡單認識C 類的默認函數 1.1 默認構造函數 1.2 析構函數 1.3 拷貝構造函數 2. 拷貝構造函數的深入理解 拷貝構造的特點: 實際運用 3. 賦值運算符重載的深入理解 3.1.運算符重載 3.2樣例 1.比較運算符重載 2.算術運算符重載 3.自增和自減運算符重載 4.輸…

板凳-------Mysql cookbook學習 (十--3)

5.16 用短語來進行fulltext查詢 mysql> select count(*) from kjv where match(vtext) against(God); ---------- | count(*) | ---------- | 0 | ---------- 1 row in set (0.00 sec)mysql> select count(*) from kjv where match(vtext) against(sin); -------…

python爬蟲ip封禁應對辦法

目錄 一、背景現象 二、準備工作 三、代碼實現 一、背景現象 最近在做爬蟲項目時&#xff0c;爬取的網站&#xff0c;如果發送請求太頻繁的話&#xff0c;對方網站會先是響應緩慢&#xff0c;最后是封禁一段時間。一直是拒絕連接&#xff0c;導致程序無法正常預期的爬取數據…

【AIGC】Qwen3-Embedding:Embedding與Rerank模型新標桿

Qwen3-Embedding&#xff1a;Embedding與Rerank模型新標桿 一、引言二、技術架構與核心創新1. 模型結構與訓練策略&#xff08;1&#xff09;多階段訓練流程&#xff08;2&#xff09;高效推理設計&#xff08;3&#xff09;多語言與長上下文支持 2. 與經典模型的性能對比 三、…

算法競賽階段二-數據結構(32)數據結構簡單介紹

數據結構的基本概念 數據結構是計算機存儲、組織數據的方式&#xff0c;旨在高效地訪問和修改數據。它是算法設計的基礎&#xff0c;直接影響程序的性能。數據結構可分為線性結構和非線性結構兩大類。 線性數據結構 線性結構中&#xff0c;數據元素按順序排列&#xff0c;每…

Windows桌面圖標修復

新建文本文件&#xff0c;粘入以下代碼&#xff0c;保存為.bat文件&#xff0c;管理員運行這個文件 duecho off taskkill /f /im explorer.exe CD /d %userprofile%\AppData\Local DEL IconCache.db /a start explorer.exe echo 執行完成上面代碼作用是刪除桌面圖標緩存庫&…

13.react與next.js的特性和原理

&#x1f7e1; 一句話總結 React 專注于構建組件&#xff0c;而 Next.js 是基于 React 的全棧框架&#xff0c;提供了頁面路由、服務端渲染和全棧能力&#xff0c;讓你能快速開發現代 Web 應用。 React focuses on building UI components, while Next.js is a full-stack fra…

全棧監控系統架構

全棧監控系統架構 可觀測性從數據層面可分為三類&#xff1a; 指標度量(Metrics)&#xff1a;記錄系統的總體運行狀態。事件日志(Logs)&#xff1a;記錄系統運行期間發生的離散事件。鏈路追蹤(Tracing)&#xff1a;記錄一個請求接入到結束的處理過程&#xff0c;主要用于排查…

云服務運行安全創新標桿:阿里云飛天洛神云網絡子系統“齊天”再次斬獲獎項

引言 為認真落實工信部《工業和信息化部辦公廳關于印發信息通信網絡運行安全管理年實施方案的通知》&#xff0c;2025年5月30日中國信息通信研究院于浙江杭州舉辦了“云服務運行安全高質量發展交流會”&#xff0c;推動正向引導&#xff0c;鞏固云服務安全專項治理成果。會上&a…

刀客doc:WPP走下神壇

一、至暗時刻&#xff1f; 6月11日&#xff0c;快消巨頭瑪氏公司宣布其價值17 億美元&#xff0c;在全球70個市場的廣告業務交給陽獅集團&#xff0c;這其中包括M&Ms、士力架、寶路等知名品牌。 此前&#xff0c;瑪氏公司一直是WPP的大客戶。早在今年3月&#xff0c;WPP就…

進行性核上性麻痹飲食攻略:營養安全雙護航

進行性核上性麻痹是一種罕見的神經系統退行性疾病&#xff0c;主要影響患者的運動、平衡和吞咽功能。除了醫學干預&#xff0c;科學的飲食管理也能在一定程度上減輕癥狀&#xff0c;提高生活質量。 由于患者常出現吞咽困難&#xff0c;食物質地的選擇尤為重要。應避免干硬、大塊…

阿里云可觀測 2025 年 5 月產品動態

本月可觀測熱文回顧 文章一覽&#xff1a; StoreView SQL&#xff0c;讓數據分析不受地域限制 不懂 PromQL&#xff1f;AI 智能體幫你玩轉大規模指標數據分析 DeepWiki LoongCollector&#xff1a;AI 重塑開源代碼理解 從 o11y 2.0 說起&#xff0c;大數據 Pipeline 的「…

React 基礎狀態管理方案

1. useState useState 是 React 提供的最基本的 Hook,用于在函數組件中添加狀態管理。它返回一個狀態變量和一個更新狀態的函數。 1.1. 使用場景 適合管理簡單的狀態。 適合管理組件內部的局部狀態。 1.2. 示例代碼 import React, { useState } from react;function Cou…

VScode中如何創建項目分支

在 VS Code 中為前端項目創建自己的分支是一個常見的開發實踐&#xff0c;以下是詳細步驟&#xff1a; 前提條件 已安裝 Git已安裝 VS Code已有前端項目或克隆了遠程倉庫 創建分支步驟 1. 打開項目 在 VS Code 中打開你的前端項目文件夾。 2. 初始化 Git 倉庫&#xff08…

Flutter 導航與路由管理:Navigator 的深入解析與實踐

在移動應用開發中&#xff0c;頁面導航是用戶體驗的核心組成部分。Flutter 提供了強大而靈活的導航系統&#xff0c;主要通過 Navigator 組件來實現。本文將全面介紹 Flutter 中 Navigator 的使用方法&#xff0c;涵蓋基礎導航操作、進階技巧以及最佳實踐。 一、Flutter 導航系…

預測性去匿名化攻擊(PDAA):重塑數據安全攻防邊界

一、數據合規時代的“脫敏”悖論&#xff1a;價值釋放與風險并存 在數據驅動的商業模式與日趨嚴格的個人信息保護法規&#xff08;如《個人信息保護法》《數據安全法》&#xff09;雙重推動下&#xff0c;企業普遍將“數據脫敏”作為實現數據合規與價值釋放的核心手段。對手機…

[python] 使用python設計濾波器

使用python設計濾波器 文章目錄 使用python設計濾波器完整濾波器設計代碼&#xff08;未經完整驗證&#xff0c;博主還在不斷完善中&#xff09;關鍵原理與代碼對應說明1. 濾波器類型選擇2. 階數估算原理3. 性能分析技術4. 設計參數調整指南 習慣了python后&#xff0c;matlab逐…