使用之间有什么区别:
$.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这样做吗?或者那里还有安全漏洞吗?
答案 0 :(得分:4)
乍一看没有真正的区别:
假设你的'node'变量只是一个节点id,两者之间差别不大。在语义上,两者似乎都执行'get'操作(即使它们在技术上是post请求),因为它们只是在不改变服务器上的任何状态的情况下检索数据(好的,这是另一个假设)。
安全方面,也没有相关的区别 - 两者都可以轻易地“伪造”,差异可以归结为与'标准'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的满载节点obect,因为%node
告诉Drupal对参数执行node_load()
在将其交给回调函数之前。使用示例的第二个版本,回调函数在从POST数据中提取后,必须自己加载节点对象。
这里很方便。
此外,Drupal中的一个常见模式是对AJAX请求使用相同的回调URL,以及其非javascript“后备”替代方案。因此,当调用yourModule_callback()
时,它可以首先对传入的节点执行任何操作,基本上可以组合其结果。完成后,它只检查POST数据中的$ajax == TRUE
。如果它存在,它知道结果是用于AJAX请求,因此它可能将结果输出为JSON。如果它不存在,它知道整个页面循环正在进行,并且可以相应地调整其输出(例如,重建表单,重新生成整个页面,等等......)。
这样,您就不必为非AJAX / AJAX回调注册单独的URL。