You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

服务端能否区分AJAX请求、GET表单请求与点击链接请求?

怎么在服务端区分AJAX请求、GET表单提交和直接点击链接?

嘿,这个问题问到点子上了!实话实说,服务端没办法100%精准区分这三种请求类型——因为HTTP本身是无状态的,且请求头、参数都可以被伪造,但我们可以通过一些常规场景下的特征来做大概率的判断,下面给你逐一拆解:

1. 识别AJAX请求

绝大多数前端框架(jQuery、Axios、Vue/React的HTTP库)或者原生XMLHttpRequest/fetch发起AJAX请求时,都会自动带上一个自定义请求头:

X-Requested-With: XMLHttpRequest

服务端可以通过检查这个头来判断是否是AJAX请求。举几个常见后端语言的示例:

  • PHP:isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest'
  • Node.js(Express):req.headers['x-requested-with'] === 'XMLHttpRequest'
  • Java(Spring):request.getHeader("X-Requested-With") != null && "XMLHttpRequest".equals(request.getHeader("X-Requested-With"))

⚠️ 注意:这个头是可以手动伪造的,所以不能用它做安全校验(比如权限控制),只能做业务逻辑上的区分。

2. 区分GET表单提交和直接点击链接

这俩其实很难严格区分——因为它们本质上都是GET请求,参数都会拼在URL的query string里,请求头也几乎一致。不过可以通过一些间接线索来推测:

  • Referer请求头:如果是表单提交,Referer通常是表单所在的页面URL;如果是点击页面上的链接,Referer是链接所在的页面URL;如果是用户直接在地址栏输入URL,Referer会是空的(或者被浏览器隐藏)。但要注意,Referer可以被禁用或伪造,且部分浏览器在跨域/HTTPS转HTTP场景下会自动隐藏Referer。
  • 参数格式:表单提交的参数通常会对应表单里的input name(比如username、password这类有业务含义的字段),而直接点击的链接参数可能更偏向于资源标识(比如article_id=123)。但这只是业务层面的规律,没有统一标准。

总结

  • AJAX请求可以通过X-Requested-With头做大概率识别,但不绝对可靠;
  • GET表单提交和直接点击链接几乎无法通过HTTP本身的特征区分,只能结合业务场景的间接线索推测;
  • 永远不要依赖这些判断做安全相关的逻辑——因为所有请求特征都可以被伪造。

内容的提问来源于stack exchange,提问作者Anshul Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:59:29