Ajax与Pjax请求在服务端是如何识别的
2017-06-08 21:32
218 查看
我在后台处理ajax和一般的网页请求时,一般是需要额外加个参数进行区分的。比如使用get参数的
但我在看Thinkphp5的官方手册时,遇到里边说:
默认情况下,控制器在ajax请求会对返回类型自动转换,默认为json。
还有:
error方法会自动判断当前请求是否属于 Ajax 请求,如果属于Ajax请求则会自动转换为default_ajax_return配置的格式返回信息。
这两处分明就不是用
翻一下源码:
原来是根据
在半夜寒羽的博客中有观点:
在发送ajax请求的时候,我们可以通过XMLHttpRequest这个对象,创建自定义的header头信息, 在jquery框架中,对于通过它的$.ajax,$.get, or $.post方法请求网页内容时,它会向服务器传递一个
但又有网友遇到有些ajax框架是不带这个信息的,这就比较坑了,想想这又不是标准规范,带不带确实都得看个性的。所以,还是自己搞个
在看源码的时候随便看到了:
看来有一个非标准约束的标志出现了
那pjax又是什么玩意?我简单将我查阅的资料摘录一下。
history API中有几个新特性,分别是history.pushState和history.replaceState,我们把pushState+AJAX进行封装,合起来简单点叫,就是PJAX。
PJAX的基本思路是,用户点击一个链接,通过ajax更新页面变化的部分,然后使用HTML5的pushState修改浏览器的URL地址,这样有效地避免了整个页面的重新加载。
如何使用:
将jquery.pjax.js部署到你的页面中,将需要使用pjax的a链接进行绑定(不能绑定外域的url),如:
至于后台,跟处理ajax一样,只是用
主要参考资料:
1、 PHP判断ajax请求:HTTP_X_REQUESTED_WITH
2、 HTTP之X-Requested-With分析和思考
3、 PJAX的实现与应用
4、 pjax:ajax和pushState结合的js库
-end-
is_ajax=1,后台判断有
is_ajax=1成立时,表明该请求是ajax请求,遂可区分处理。我正在使用的电商网站TPshop里边我遇到的都这样处理,如果一个接口可同时处理网页和jax的话,需要使用is_ajax来区分。
但我在看Thinkphp5的官方手册时,遇到里边说:
默认情况下,控制器在ajax请求会对返回类型自动转换,默认为json。
还有:
error方法会自动判断当前请求是否属于 Ajax 请求,如果属于Ajax请求则会自动转换为default_ajax_return配置的格式返回信息。
这两处分明就不是用
is_ajax来区分网页和ajax请求的,那到底是什么原理呢?
翻一下源码:
/** * 当前是否Ajax请求 * @access public * @param bool $ajax true 获取原始ajax请求 * @return bool */ public function isAjax($ajax = false) { $value = $this->server('HTTP_X_REQUESTED_WITH', '', 'strtolower'); $result = ('xmlhttprequest' == $value) ? true : false; if (true === $ajax) { return $result; } else { return $this->param(Config::get('var_ajax')) ? true : $result; } }
原来是根据
$_SERVER[‘HTTP_X_REQUESTED_WITH‘]来设别的,所有的ajax请求都会带这个标识吗?
在半夜寒羽的博客中有观点:
在发送ajax请求的时候,我们可以通过XMLHttpRequest这个对象,创建自定义的header头信息, 在jquery框架中,对于通过它的$.ajax,$.get, or $.post方法请求网页内容时,它会向服务器传递一个
HTTP_X_REQUESTED_WITH的参数,php中就是在header一层判断是否是ajax请求,对应的根据
$_SERVER['HTTP_X_REQUESTED_WITH']判断。
但又有网友遇到有些ajax框架是不带这个信息的,这就比较坑了,想想这又不是标准规范,带不带确实都得看个性的。所以,还是自己搞个
is_ajax变量做判断妥一些。如果是自己开发的网站,用的是jquery,应该也无所谓了。
在看源码的时候随便看到了:
/** * 当前是否Pjax请求 * @access public * @param bool $pjax true 获取原始pjax请求 * @return bool */ public function isPjax($pjax = false) { $result = !is_null($this->server('HTTP_X_PJAX')) ? true : false; if (true === $pjax) { return $result; } else { return $this->param(Config::get('var_pjax')) ? true : $result; } }
看来有一个非标准约束的标志出现了
HTTP_X_PJAX。(非标准的好像都带上‘X’)。
那pjax又是什么玩意?我简单将我查阅的资料摘录一下。
history API中有几个新特性,分别是history.pushState和history.replaceState,我们把pushState+AJAX进行封装,合起来简单点叫,就是PJAX。
PJAX的基本思路是,用户点击一个链接,通过ajax更新页面变化的部分,然后使用HTML5的pushState修改浏览器的URL地址,这样有效地避免了整个页面的重新加载。
如何使用:
将jquery.pjax.js部署到你的页面中,将需要使用pjax的a链接进行绑定(不能绑定外域的url),如:
$('a').pjax({ container: '#container', //内容替换的容器 fx: 'fade', //展现的动画,支持默认和fade, 可以自定义动画方式。 cache: true, //是否使用缓存 storage: true, //是否使用本地存储 titleSuffix: '' //标题后缀 });
至于后台,跟处理ajax一样,只是用
HTTP_X_PJAX来区分是否是pjax请求。
主要参考资料:
1、 PHP判断ajax请求:HTTP_X_REQUESTED_WITH
2、 HTTP之X-Requested-With分析和思考
3、 PJAX的实现与应用
4、 pjax:ajax和pushState结合的js库
-end-
相关文章推荐
- php服务端 如何接受前端使用ajax发送get请求而传递过来的汉字
- Server端接收了不一样的请求,在服务端要如何识别并操作呢
- php服务端 如何接受前端使用ajax发送get请求而传递过来的汉字
- 如何在服务端判断request来自AJAX请求还是传统的同步请求
- jQuery通过Ajax向PHP服务端发送请求并返回JSON数据
- AJAX请求JSP输出的XML不能识别为responseXML解决方案
- 在php中,如何判断一个请求是ajax请求还是普通请求?
- 如何使用Ajax从服务端获取数据
- jQuery通过Ajax向PHP服务端发送请求并返回JSON数据
- ajax中如何将utf-8编码的数据请求发送到gbk编码应用的解决方法
- Ruby on Rails,服务端如何响应页面提交的请求
- 如何管理庞大的Ajax请求?
- Ajax(4):post请求之表单中含有中文时如何处理
- 如何解决Ajax请求结果的缓存问题说明
- WCF ajax调用,同一浏览器窗口的多个请求在服务端阻塞,只能顺序执行的问题
- 如何使用Ajax(XMLHttpRequest)发送带参数的请求,以及如何在Servlet中获取请求中的参数
- 如何将Ajax请求改为同步
- 如何管理庞大的Ajax请求?
- ajax请求数据,服务端输出的取巧方式
- ajax如何取消挂起的请求