开头
关于 ANDROID 5.0-7.1.2 网络图标上的感叹号及其解决办法-狐狸的小小窝
HTTP状态码之204 No Content
原理
访问generate_204地址,如果得到状态码是204则网络畅通。
如果不是,则需要认为需要登录
但是以下测试让我有点懵逼
测试
请自行下载curl工具
在未登录的情况下,我们访问generate_204地址试试,如:
C:WINDOWSsystem32>curl http://edge.microsoft.com/captiveportal/generate_204
<html>
<head>
<meta http-equiv="Cache-Control" contect="no-cache">
<meta http-equiv="Pragma" contect="no-cache">
<meta http-equiv="Expires" contect="0">
<script type="text/javascript">
location.replace("http://这里是WIFI登录地址");
</script></head><body>
</body></html>
C:WINDOWSsystem32>
发现可以直接得到跳转的地址(即WIFI Portal登录地址)
关于函数location.replace() 见: https://developer.mozilla.org/zh-CN/docs/Web/API/Location/replace
而登录WIFI之后,再访问204地址则是得到空内容
C:WINDOWSsystem32>curl http://edge.microsoft.com/captiveportal/generate_204
C:WINDOWSsystem32>
抓包结果
所以有没有人告诉我为什么访问204地址能得到登录地址呢?以下是Fiddler抓包内容
好像是直接返回带有302的状态码的响应报文(Response)?
那么它的实现原理应该就是拦截了未登录用户的所有http请求并返回302(HTTP重定向)?
试了一下未登录时curl baidu.com也是返回302,但是curl https://baidu.com却不返回,也就是说不能劫持https请求?
疑问:那204的https只是用来验证网络通畅性?http才能用来验证网络通畅性并登录?不清楚,这个得拿到源码才知道。
相关资料
可用的204地址有:
http://connect.rom.miui.com/generate_204
http://connectivitycheck.platform.hicloud.com/generate_204
http://edge.microsoft.com/captiveportal/generate_204
非204——检测连通性地址
http://www.msftncsi.com/ncsi.txt
http://detectportal.firefox.com/success.txt
可能有用的资料:
https://gmd20.github.io/blog/Wifi热点强制登录认证页面captive portal相关资料
当您的计算机连接到公司网络或公共网络时,将打开 Internet Explorer 或 Edge 网页-微软
https://wenku.baidu.com/view/be00908884868762caaed57f.html
Captive Portal - 连接WiFi自动弹出认证页面
好像还有判断portal登陆是否支持https的代码,见
http://androidxref.com/8.0.0_r4/xref/frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java#mUseHttps
的914行附近