【发布时间】:2022-05-11 21:53:22
【问题描述】:
我需要可靠地检测设备是否具有完整的互联网访问权限,即用户不限于强制门户(也称为围墙花园),即有限的子网,它强制用户在表单上提交他们的凭据以获得完全访问权限。
我的应用程序正在自动执行身份验证过程,因此在开始登录活动之前了解无法完全访问互联网非常重要。
问题不是关于如何检查网络接口是否已启动并处于连接状态。这是为了确保设备具有不受限制的互联网访问权限,而不是沙盒内网段。
到目前为止我尝试过的所有方法都失败了,因为连接到任何知名主机都不会引发异常,而是返回有效的HTTP 200 响应代码,因为所有请求都被路由到登录页面。
以下是我尝试过的所有方法,但由于上述原因,它们都返回 true 而不是 false:
1:
InetAddress.getByName(host).isReachable(TIMEOUT_IN_MILLISECONDS);
isConnected = true; <exception not thrown>
2:
Socket socket = new Socket();
SocketAddress sockaddr = new InetSocketAddress(InetAddress.getByName(host), 80);
socket.connect(sockaddr, pingTimeout);
isConnected = socket.isConnected();
3:
URL url = new URL(hostUrl));
URLConnection urlConn = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) urlConn;
httpConn.setAllowUserInteraction(false);
httpConn.setRequestMethod("GET");
httpConn.connect();
responseCode = httpConn.getResponseCode();
isConnected = responseCode == HttpURLConnection.HTTP_OK;
那么,如何确保我连接到实际主机而不是登录重定向页面?显然,我可以从我使用的“ping”主机检查实际的响应正文,但它看起来不是一个合适的解决方案。
【问题讨论】:
-
由于上游设备(即captive portal)可以将任何内容与 HTTP 200 一起发送回去,实际上检查 HTTP 响应正文似乎是 100% 保证您到达“外面的世界”。当然,即使在那里页面也可以被缓存......但这不太可能。解决缓存问题的常见方法是在请求的 URL 中包含虚假的 HTTP GET 参数(即
?time=1234)。
标签: android http authentication redirect connectivity