为什么需要身份验证?
当你在 DedeCMS 的后台(/dede/ 目录)页面中使用 jQuery 发起 AJAX 请求时,浏览器会自动带上当前登录用户的 Session Cookie,DedeCMS 的后台系统会通过这个 Cookie 来验证你是否已经登录。

如果你在未登录状态下访问一个需要后台权限的页面,或者你的登录 Session 已过期,DedeCMS 的后端程序在处理 AJAX 请求时,会发现你没有通过身份验证,这时,它不会直接返回一个错误码(如 401),而是会返回一个完整的 HTML 登录页面。
你看到的“需要身份验证”的真正表现是:你的 AJAX 请求没有收到预期的 JSON 或数据,而是收到了整个登录页面的 HTML 代码,你的前端 JavaScript 收到这个 HTML 后,通常会不知道如何处理,导致功能失效。
场景分析
这个需求会出现在以下两种情况:
- 在前台模板页(网站首页、文章页等)操作后台数据:在前台页面上添加一个“一键审核”按钮,点击后通过 AJAX 调用后台的审核接口。这是非常危险的做法,强烈不推荐! 这会暴露你的后台接口,任何人都可以调用,导致网站被恶意攻击。
- 在自定义的后台页面或功能中使用 AJAX:这是最常见且正确的场景,你在 DedeCMS 后台添加了一个新的功能模块(订单管理”),在这个模块的页面里,你需要用 AJAX 来加载或提交数据,以实现更好的用户体验。
我们将重点讨论第二种场景,因为它更合理且安全。

解决方案:在自定义后台页面中安全地使用 jQuery AJAX
假设你要在 /dede/ 目录下的一个自定义页面 my_custom_page.php 中使用 jQuery AJAX。
第 1 步:确保 jQuery 已正确加载
DedeCMS 的后台页面通常已经加载了 jQuery,但为了确保万无一失,最好在你自己的页面顶部也加上,DedeCMS 后台使用的是较旧版本的 jQuery(通常是 1.x 或 2.x),所以最好也保持一致。
在你的 my_custom_page.php 文件头部,找到引入 JS 文件的地方,加入:
<script type="text/javascript" src="js/jquery.js"></script>
(js/jquery.js 是 DedeCMS 默认存放 jQuery 的路径,请根据你的实际情况调整)

第 2 步:创建一个专门处理 AJAX 请求的 PHP 文件
这是最关键的一步。永远不要让你的主页面直接处理 AJAX 请求,创建一个新的 PHP 文件来作为你的 AJAX 接口。
在 /dede/ 目录下创建一个文件:ajax_handler.php。
这个文件需要做两件事:
- 验证身份:确保请求来自已登录的后台用户。
- 处理业务逻辑:执行具体的操作(如查询数据库、更新数据等)。
/dede/ajax_handler.php 的内容示例:
<?php
/**
* AJAX 请求处理文件
*
* 引入 DedeCMS 的核心文件,以获取所有环境变量和已登录用户信息
*/
require_once(dirname(__FILE__) . "/config.php");
// 检查用户是否已登录
// !empty($cuserLogin->getUserID()) 是判断 DedeCMS 用户是否登录的标准方法
if (!empty($cuserLogin->getUserID())) {
// --- 用户已通过验证,开始处理业务逻辑 ---
// 获取通过 POST 或 GET 传来的操作参数
$action = isset($action) ? $action : '';
if ($action == 'get_some_data') {
// 这里写你的具体逻辑,比如从数据库查询数据
$data = array(
'name' => '示例数据',
'value' => mt_rand(1, 100)
);
// 将数据以 JSON 格式返回给前端
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data);
exit;
} else if ($action == 'do_something') {
// 另一个操作,比如更新数据库
// ... 你的代码 ...
$response = array('status' => 'success', 'message' => '操作成功!');
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response);
exit;
} else {
// 如果没有指定有效的 action,返回错误
header('HTTP/1.1 400 Bad Request');
echo json_encode(array('status' => 'error', 'message' => '无效的请求参数'));
exit;
}
} else {
// --- 用户未登录,返回未授权错误 ---
// 设置 HTTP 状态码为 401 (Unauthorized)
header('HTTP/1.1 401 Unauthorized');
// 返回一个简单的 JSON 错误信息,方便前端判断
// 返回 HTML 登录页面也可以,但 JSON 更利于 JS 处理
echo json_encode(array('status' => 'error', 'message' => '请先登录'));
exit;
}
?>
第 3 步:在你的后台页面中编写 jQuery AJAX 代码
现在回到你的 my_custom_page.php 页面,编写 AJAX 调用代码。
<script type="text/javascript">
$(document).ready(function() {
// 模拟一个点击事件来触发 AJAX 请求
$('#myButton').click(function() {
// 显示一个加载提示
$('#loading').text('加载中...');
// 发起 AJAX GET 请求
$.ajax({
// 请求我们刚刚创建的 PHP 接口文件
url: 'ajax_handler.php',
// 传递的参数,action 用于告诉后端要执行哪个操作
data: {
'action': 'get_some_data',
'other_param': 'some_value' // 你可以传递任意参数
},
// 期望服务器返回的数据类型
dataType: 'json',
// 请求成功时的回调函数
success: function(response) {
// response PHP 返回的 JSON 对象
if (response.status === 'success') {
$('#result').html('数据: ' + response.name + ' - ' + response.value);
} else {
$('#result').html('错误: ' + response.message);
}
$('#loading').text('');
},
// 请求失败时的回调函数
error: function(xhr, status, error) {
// 这里可以处理 401 未授权等错误
if (xhr.status === 401) {
alert('会话已过期,请重新登录!');
// 可以在这里跳转到登录页
// window.location.href = 'login.php';
} else {
$('#result').html('请求失败: ' + error);
}
$('#loading').text('');
}
});
});
});
</script>
<!-- 页面上的 HTML 元素 -->
<button id="myButton">点击获取数据</button>
<div id="loading"></div>
<div id="result"></div>
总结与最佳实践
- 分离关注点:永远不要在页面逻辑中混合业务逻辑,创建一个独立的 PHP 文件作为 AJAX API。
- 身份验证是必须的:在 AJAX 处理文件的开头,务必使用
require_once('config.php');并通过$cuserLogin->getUserID()来验证用户身份。 - 使用 JSON 通信:让 PHP 后端返回
application/json格式的数据,这比返回 HTML 或纯文本更易于 JavaScript 解析和处理。 - 处理错误:在前端
error回调中,特别是要处理 HTTP 401 (Unauthorized) 错误,提示用户重新登录。 - 安全性:对从前端传来的所有参数(如
action,id等)进行严格的校验,防止 SQL 注入或其他攻击。
通过以上步骤,你就可以在 DedeCMS 后台安全、有效地使用 jQuery AJAX 了。
