概述
打开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: report.csdn.net:4089
Origin: https://bbs.csdn.net
Referer: https://bbs.csdn.net/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请求头消息:
httpGet.setHeader(“User-Agent”, “Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0”); // 设置请求头消息User-Agent
https://blog.csdn.net/u013215018/article/details/55045392
CloseableHttpClient httpClient=HttpClients.createDefault(); // 创建httpClient实例
HttpGet httpGet=new HttpGet("http://www.tuicool.com/"); // 创建httpget实例
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0"); // 设置请求头消息User-Agent
CloseableHttpResponse response=httpClient.execute(httpGet); // 执行http get请求
HttpEntity entity=response.getEntity(); // 获取返回实体
System.out.println("网页内容:"+EntityUtils.toString(entity, "utf-8")); // 获取网页内容
response.close();
httpClient.close();
简易区分HTTP请求是来自浏览器还是应用程序
1、获取请求的HttpServletRequest
HttpServletRequest httpServletRequest=ServletActionContext.getRequest();
2、拦截器中判断Request Header属性
String remoteAddr = httpServletRequest.getRemoteAddr();
if (httpServletRequest.getHeader(“User-Agent”).startsWith(“Mozilla”)) {
LOGGER.debug("remote request from browser, remote addr:{}.", remoteAddr);
} else {
LOGGER.debug("remote request from application, remote addr:{}.", remoteAddr);
httpServletRequest.setAttribute(“solr.security.skip.cas”, "true");
}
有篇博客中提到可以通过Request Header中得“Content-Type”和“Accept”两个属性来判断请求是来自浏览器还是应用程序。但是要注意的是,这个判断逻辑不一定适用于任何网站,比如CSDN论坛的Request Header和Response Header都包含了Content-Type属性,通过这种方法可能会导致误判。
其实Request Header的属性在应用程序的代码里面都是可以手动添加的,所以仅仅是判断Header里面的任何属性,都是容易被模仿的。
换个说法,如果这种在Request Header添加一两个属性就能轻易判断HTTP请求是来自浏览器还是应用程序方法就能work,那么你也太小瞧12306防范抢票软件的研发部门了!
如果有那么简单就能区分,哪还需要什么奇葩百出的验证码呢~~
附上彩蛋1
附上彩蛋2
附上彩蛋3
最后
以上就是缓慢香水为你收集整理的如何判断一个HTTP请求是浏览器请求还是应用程序请求?的全部内容,希望文章能够帮你解决如何判断一个HTTP请求是浏览器请求还是应用程序请求?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复