使用有什么区别:
$.ajax({
type: 'POST',
url: Drupal.settings.basePath + 'module/get/' + node,
dataType: 'json',
data: { 'ajax' : true }
});
对比:
$.ajax({
type: 'POST',
url: Drupal.settings.basePath + 'module/get',
dataType: 'json',
data: { 'ajax' : true, 'node' : node }
});
在第一种情况下,您将访问节点变量作为回调函数中的参数,而在第二种情况下,您将使用 $_POST['node'] 访问它,对吗?第二种方法不是总是更好,但我看到很多人用第一种方法。并不是说第二种方式也很安全。仍在研究表单标记,但首先尝试弄清楚这个基本位。
还想知道案例 1,假设这个 ajax 是由一个按钮触发的,你如何阻止一个人直接输入 url,mysite/module/get/20 并激活它?仅仅检查 $_POST['ajax'] == true 就可以做到这一点吗?还是那里仍然存在安全漏洞?
最佳答案
乍一看没有真正的区别:
假设你的'node'变量只是一个节点id,那么两者之间没有太大区别。从语义上讲,两者似乎都执行“获取”操作(尽管从技术上讲它们是发布请求),因为它们只是检索数据而不更改服务器上的任何状态(好吧,这是另一个假设)。
在安全方面,也没有相关差异 - 两者都可以很容易地“伪造”,差异归结为与“标准”GET 与 POST 辩论相同,也就是说,除了第一个公开之外没有区别对于不经意的观察者来说,这些参数更“易于访问”,因为它们在 URL 中显而易见。
但 Drupal 中的“便利性”差异:
在 Drupal 中,经常会遇到第一个版本,因为它可以利用 Wildcard Loader Arguments功能(在 Drupal 6 中引入)。假设您的回调 URL 在 hook_menu 中定义如下:
$items['module/get/%node'] = array(
'title' => 'Foo',
'type' => MENU_CALLBACK,
'page callback' => 'yourModule_callback',
'page arguments' => array(2),
);
有了这个,yourModule_callback()
将被调用,它的第一个参数已经是传入 nid 的完全加载的节点对象,因为 %node
告诉 Drupal 执行node_load()
在将参数移交给回调函数之前。使用示例的第二个版本,回调函数必须在从 POST 数据中提取节点对象后加载它本身。
这里很方便。
此外,Drupal 中的一个常见模式是对 AJAX 请求使用与其非 javascript“后备”替代方案相同的回调 URL。因此,当 yourModule_callback()
被调用时,它可以首先对传入的节点执行任何它打算执行的操作,基本上是组装其结果。完成后,它只检查 POST 数据中的 $ajax == TRUE
。如果它存在,它就知道结果是针对 AJAX 请求的,因此它可能会将结果输出为 JSON。如果它不存在,它就知道正在进行一个完整的页面循环,并可以相应地调整其输出(例如,重建表单、重新生成整个页面,等等......)。
这样,您就不必为非 AJAX/AJAX 回调注册单独的 URL。
关于ajax - Drupal 的 Ajax : Passing values by url vs data param,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2144983/