如何使用boost::beast检测Ajax请求?
用Boost.Beast检测Ajax请求
判断Ajax请求的核心依据是浏览器发送的**X-Requested-With: XMLHttpRequest**请求头——这是原生XMLHttpRequest对象会自动添加的标识(注:原生fetch API默认不会携带该头,需要前端手动设置)。虽然这个头可以被客户端伪造,但如果浏览器按规范发送了该数据,你可以用Boost.Beast直接读取请求头来判断。
实现步骤
Boost.Beast的http::request对象提供了便捷的头操作方法,你可以通过以下方式检测:
- 使用预定义的字段枚举
http::field::x_requested_with查找请求头 - 检查头的值是否为
XMLHttpRequest
代码示例
#include <boost/beast/http.hpp> namespace http = boost::beast::http; // 传入已解析的HTTP请求对象,判断是否为Ajax请求 bool is_ajax_request(const http::request<http::dynamic_body>& req) { // 查找X-Requested-With头 auto header_it = req.find(http::field::x_requested_with); if (header_it != req.end()) { // 匹配标准的Ajax标识值 return header_it->value() == "XMLHttpRequest"; } // 若未找到该头,判定为非Ajax请求 return false; }
注意事项
- fetch API的特殊情况:如果前端用
fetch发送请求,默认不会添加X-Requested-With头,需要前端手动配置:fetch('/api/data', { headers: { 'X-Requested-With': 'XMLHttpRequest' } }); - 不可信的标识:该头可以被客户端随意修改,不能用于安全校验(比如权限控制),仅适合用于业务逻辑区分(比如返回JSON还是HTML页面)。
- 其他辅助判断:你也可以结合
Accept或Content-Type头辅助判断(比如Ajax请求常接受application/json),但这些都不是绝对可靠的标识,核心判断仍以X-Requested-With为准。
内容的提问来源于stack exchange,提问作者Samuel Smith
相关产品推荐
相关产品推荐

