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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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逐…