3

使用有什么区别:

 $.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 这样做吗?还是那里仍然存在安全漏洞?

4

1 回答 1

4

乍一看没有真正的区别:

假设您的“节点”变量只是一个节点 ID,则两者之间没有太大区别。从语义上讲,两者似乎都执行“获取”操作(即使它们在技术上是发布请求),因为它们只是检索数据而不更改服务器上的任何状态(好吧,这是另一个假设)。

安全方面,也没有相关的区别——两者都可以很容易地“伪造”,区别归结为与“标准”GET 与 POST 辩论相同,也就是说,除了第一个公开参数 a 之外没有区别对于不经意的观察者来说,我们更容易“访问”,因为它们在 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 的完全加载的节点对象,因为它告诉 Drupal在将参数移交给回调函数之前对参数%node执行 a 。node_load()使用示例的第二个版本,回调函数必须在从 POST 数据中提取节点对象后加载节点对象本身。

所以这里很方便。

此外,Drupal 中的一个常见模式是对 AJAX 请求使用与其非 javascript 'fallback' 替代方案相同的回调 URL。所以当yourModule_callback()被调用时,它可以首先对传入的节点做任何它想要做的事情,基本上是组装它的结果。完成后,它只检查$ajax == TRUEPOST 数据中的内容。如果它在那里,它就知道结果是针对 AJAX 请求的,因此它可能会将结果输出为 JSON。如果它不存在,它就知道一个完整的页面循环正在进行,并且可以相应地调整其输出(例如重建一个表单,重新生成一个整个页面,等等......)。

这样,您不必为非 AJAX/AJAX 回调注册单独的 URL。

于 2010-01-27T08:32:49.610 回答