我在后台处理ajax和一般的网页请求时,一般是需要额外加个参数进行区分的。比如使用get参数的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-

Ajax与Pjax请求在服务端是如何识别的的更多相关文章

  1. Ajax跨域请求——PHP服务端处理

    header('Access-Control-Allow-Origin:*'); // 响应类型 header('Access-Control-Allow-Methods:POST'); // 响应头 ...

  2. python服务器端、客户端的模型,客服端发送请求,服务端进行响应(web.py)

    服务器端.客户端的模型,客服端发送的请求,服务端的响应 相当于启动了一个web server install web.py 接口框架用到的包 http://webpy.org/tutorial3.zh ...

  3. 前端发起resultUrl请求,服务端收到后做逆向处理,校验sign后,执行originUrl逻辑

    originUrl=http://test.com:8080/user/alipay_phone?uid=123&amount=21.3第0步:前后端约定32位密钥KEY第一步:对参数按照ke ...

  4. 用http请求thrift服务端出现了内存溢出的情况

    记一次内存溢出的分析经历 - Janti - 博客园 https://www.cnblogs.com/superfj/p/8474288.html 说在前面的话 朋友,你经历过部署好的服务突然内存溢出 ...

  5. ajax客户端请求与服务端响应浅谈

    AJAX,即Asynchronous Javascript And XML,AJAX本质是在HTTP协议的基础上以异步的方式与服务器进行通信. 所谓的异步,是指某段程序执行不会阻塞其他程序执行,其表现 ...

  6. jq ajax传递json对象到服务端及contentType的用法

    目录 0.一般情况下,通过键值对的方式将参数传递到服务端 1.ajax 传递复杂json对象到服务端 2.content-Type 对asp.net mvc项目的重要性 0.一般情况下,通过键值对的方 ...

  7. java httpclient发送json 请求 ,go服务端接收

    /***java客户端发送http请求*/package com.xx.httptest; /** * Created by yq on 16/6/27. */ import java.io.IOEx ...

  8. Socket(TCP)客户端请求和服务端监听和链接基础(附例子)

    一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...

  9. 支付宝ios支付请求Java服务端签名报的一个错(ALI40247) 原创

    今天做app的支付宝支付,遇到些问题,以前做支付宝支付签名都是直接在客户端App进行,今天下了最新版本ios的支付宝支付demo,运行demo时底部有红色的显眼字体,告知用户签名必须在服务端进行... ...

随机推荐

  1. ios微信自动播放音乐

    <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8 ...

  2. 日期格式化,moment.js

    官方文档:http://momentjs.com/; 使用方法:moment(data).format("YYYY-MM-DD");//data为日期的字符串形式 moment() ...

  3. Memcache存储机制与指令汇总

    1.memcache基本简介 memcached是高性能的分布式内存缓存服务器.一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度.提高可扩展性. Memcach ...

  4. Diary of Codeforces Round #402 (Div. 2)

    这一场的表现可以用"全程智障"4个字,生动传神地描述出来. About 写题: A. 写了一堆if比较大小, 这很勤勉.(绝对值君对自己の存在感为0表示很难过.) B. 题,直接读 ...

  5. VSCode里的一些有用的插件

    1.EaseServer 作用:开启本地 http server,然后在browser里打开html: 在调试页面的时候,打开页面比较方便,不需要先开启server,再打开html 2.Debugge ...

  6. AspectJ基本用法

    参考:深入理解Android之AOP AOP虽然是方法论,但就好像OOP中的Java一样,一些先行者也开发了一套语言来支持AOP.目前用得比较火的就是AspectJ了,它是一种几乎和Java完全一样的 ...

  7. vuejs学习笔记(2)--属性,事件绑定,ajax

    属性 v-for 类似于angular中的 ng-repeat ,用于重复生成html片段: <ul id="box"> <li v-for="(v, ...

  8. laravel安装插件laravel-ide-helper

    1.插件位置laravel-ide-helper https://github.com/barryvdh/laravel-ide-helper 2.首先改变镜像源为国内的镜像源 P { margin- ...

  9. 解决移动端click点击问题

    下载地址:https://github.com/ftlabs/fastclick 1,为什么移动端点击会有300ms的延迟呢? 从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约 3 ...

  10. ios 添加工程依赖只能生成Generic Xcode Archive 文件原因

    问题说明:工程引用了外部类库, 默认生成的archive是 Generic Xcode Archive 格式的 无法发布和生成ipa文件. 解决处理: 1.将Build Settings->De ...