如何判断一个HTTP请求是浏览器请求还是应用程序请求?

时间:2024-11-06 07:55:34

打开F12并刷新浏览器页面,可以从Request Headers中获取请求头Header信息,一般会有如下几项信息:
Accept: /
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Length: 716
Content-Type: text/plain;charset=UTF-8
Host: :4089
Origin:
Referer: /topics/380250315
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36

比如我们浏览器请求头会附带User-Agent属性,内容以Mozilla开头。因此我们可以利用下列代码块简单区分HTTP请求是来自浏览器还是应用程序。
请注意,网络爬虫或其它软件比如黄牛抢票小程序会模拟这个信息,所以仅从Request Header属性无法绝对实现区分请求是来自浏览器还是应用程序。

简易模拟浏览器请求
在HTTP Request中设置User-Agent请求头消息:
(“User-Agent”, “Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0”); // 设置请求头消息User-Agent
/u013215018/article/details/55045392

CloseableHttpClient httpClient=(); // 创建httpClient实例
HttpGet httpGet=new HttpGet("/"); // 创建httpget实例
("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0"); // 设置请求头消息User-Agent
CloseableHttpResponse response=(httpGet); // 执行http get请求
HttpEntity entity=(); // 获取返回实体
("网页内容:"+(entity, "utf-8")); // 获取网页内容
();
();

简易区分HTTP请求是来自浏览器还是应用程序
1、获取请求的HttpServletRequest

HttpServletRequest httpServletRequest=();

2、拦截器中判断Request Header属性

String remoteAddr = ();
if ((“User-Agent”).startsWith(“Mozilla”)) {
    ("remote request from browser, remote addr:{}.", remoteAddr);
} else {
    ("remote request from application, remote addr:{}.", remoteAddr);
    (“”, "true");
}

有篇博客中提到可以通过Request Header中得“Content-Type”和“Accept”两个属性来判断请求是来自浏览器还是应用程序。但是要注意的是,这个判断逻辑不一定适用于任何网站,比如****论坛的Request Header和Response Header都包含了Content-Type属性,通过这种方法可能会导致误判。

Request Header解析

其实Request Header的属性在应用程序的代码里面都是可以手动添加的,所以仅仅是判断Header里面的任何属性,都是容易被模仿的。
换个说法,如果这种在Request Header添加一两个属性就能轻易判断HTTP请求是来自浏览器还是应用程序方法就能work,那么你也太小瞧12306防范抢票软件的研发部门了!
如果有那么简单就能区分,哪还需要什么奇葩百出的验证码呢~~
附上彩蛋1
附上彩蛋2
附上彩蛋3