ajax - Drupal 的 Ajax : Passing values by url vs data param

标签 ajax drupal submission

使用有什么区别:

 $.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/

相关文章:

php - 旧的 CMS/博客网站会怎样?

复杂关系的 Drupal 最佳实践

php - Drupal 忽略服务器权限并显示权限错误

iphone - App在Apple崩溃,但尚未测试

php - 尝试在应用程序中发布图像

javascript - CodeIgniter 将 AJAX 数据传递回 Controller

ajax - Elm 中的模拟依赖

jquery - IE 中的 this.value 问题

php - search_model::autocomplete() 缺少参数 1,

xcode - 在 Xcode 7 上,我不断收到错误 "No accounts with iTunes connect access"