Drupal Ajax:通过 url 与数据参数传递值

Posted

技术标签:

【中文标题】Drupal Ajax:通过 url 与数据参数传递值【英文标题】:Drupal Ajax: Passing values by url vs data param 【发布时间】:2010-01-27 06:29:00 【问题描述】:

使用有什么区别:

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

【问题讨论】:

你能解释一下为什么你认为第二种方法总是更好吗? 我认为这会更好一些,因为它不会暴露 url 中的参数。现在我明白了这两种方法是如何有用的。 【参考方案1】:

乍一看没有真正的区别:

假设您的“节点”变量只是一个节点 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 'fallback' 替代方案相同的回调 URL。因此,当yourModule_callback() 被调用时,它可以首先对传入的节点做任何它想要做的事情,基本上是组装它的结果。完成后,它只检查 POST 数据中的$ajax == TRUE。如果它在那里,它就知道结果是针对 AJAX 请求的,因此它可能会将结果输出为 JSON。如果它不存在,它就知道整个页面循环正在进行,并且可以相应地调整其输出(例如,重建表单、重新生成整个页面等等......)。

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

【讨论】:

感谢您详细解释两者之间的区别。 :) 我知道这两种方式现在如何有用了。我的表单的工作方式是它通常用于 ajax,但是如果禁用了 js,它将回退到使用表单 api 提交表单。 仍然想知道在我的回调中简单地检查 $ajax==TRUE 以确定是否有人不只是转到 url 而不是使用表单是否是万无一失的。例如,最初您转到“mysite/module/get/20”,您将触发回调(我不希望发生这种情况),但如果您包装回调检查 $ajax==true 您可以防止.这样那个url就不会再触发回调了,也不能使用mysite/module/get/20&ajax=true之类的东西来触发回调?是否还有棘手的方法可以绕过它,或者它应该是安全的吗?谢谢。 这不会是“万无一失的”。它只会确认 'ajax = true' 已发布给您,但不能确认该帖子实际上来自您的表单。 (因此只能防止通过标准 GET 进行“轻松”访问)。为了确保帖子本身来自表单,您必须使用 formsAPI 处理逻辑来重建表单并验证表单 Token。对于一个简单的 AJAX 回调来说,这听起来有点矫枉过正——你为什么担心有人可以在不来自表单的情况下获取数据? (如果用户可以访问表单,ha 无论如何都可以得到 AJAX 响应) 对于这个ajax我不是太在意,但是我还有另外一个ajax表单可以将数据插入到数据库中。我刚刚在我的表单中添加了一个额外的令牌,但我不确定它是否与您提到的相同。我使用 drupal_get_token 将其添加到 drupal.settings 并将其作为数据发送并使用 drupal_valid_token 在服务器端进行验证。那是为了防止XSS和你说的token不一样吧?我将如何使用该方法?也许这也有助于我的另一个问题:***.com/questions/2130714/… 这与表单 API 使用的令牌机制相同。我发布了对您其他问题的回答 - 那里的链接应该会有所帮助。 (很抱歉没有发布一个具体的例子,但我不记得我脑海中的细节,几个月后我总是需要自己再次查找这些东西;)

以上是关于Drupal Ajax:通过 url 与数据参数传递值的主要内容,如果未能解决你的问题,请参考以下文章

Ajax异步传值以及后端接收参数的4种方式

使用ajax将参数发送到drupal视图

在 ajax 调用中使用 datatable url 属性将参数传递给服务器

将 AJAX POST 的参数传递给 Grails 控制器

封装ajax原理

ajaxFileUpload 怎么传相关参数到后台