Мне нужно надежно определить, имеет ли устройство полный доступ к Интернету, т.е. что пользователь не ограничен узким порталом (также называемым огороженным садом), то есть ограниченной подсетью, которая заставляет пользователей отправлять свои учетные данные в форме для того, чтобы для получения полного доступа.
Мое приложение автоматизирует процесс аутентификации, и поэтому важно знать, что полный доступ в Интернет недоступен до начала действия входа в систему.
Вопрос не в том, как проверить, что сетевой интерфейс вставлен и подключен. Речь идет о том, чтобы обеспечить неограниченное доступ к Интернету, в отличие от изолированного сегмента интрасети.
Все подходы, которые я пробовал до сих пор, терпят неудачу, потому что подключение к любому известному хосту не приведет к исключению, а вернет правильный код ответа 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", но это не похоже на правильное решение.