Как проверить неограниченный доступ в интернет? (обнаружение портала в неволе)
Мне нужно надежно определить, имеет ли устройство полный доступ к Интернету, т. Е. Что пользователь не ограниченпленник портала (также называемыйогороженный сад), т. е. ограниченная подсеть, которая вынуждает пользователей отправлять свои учетные данные в форме, чтобы получить полный доступ.
Мое приложение автоматизирует процесс аутентификации, и поэтому важно знать, что полный доступ в Интернет недоступен перед началом входа в систему.
Вопрос в томне о том, как проверить, что сетевой интерфейс работает и в подключенном состоянии. Речь идет о том, чтобы убедиться, что устройство имеет неограниченный доступ в Интернет, а не сегмент изолированной интрасети.
Все подходы, которые я пробовал до сих пор, терпят неудачу, потому что подключение к любому известному хосту не вызовет исключения, а вернет действительныйHTTP 200
Код ответа, потому что все запросы направляются на страницу входа.
Вот все подходы, которые я пробовал, но все они возвращаютсяtrue
вместоfalse
по причинам, изложенным выше:
1:
InetAddress.getByName(host).isReachable(TIMEOUT_IN_MILLISECONDS);
isConnected = true;
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;
Итак, как мне убедиться, что я подключился к реальному хосту, а не к странице перенаправления входа? Очевидно, я мог проверить фактическое тело ответа изпинг' Я использую хост, но это не похоже на правильное решение.