Как проверить неограниченный доступ в интернет? (обнаружение портала в неволе)

Мне нужно надежно определить, имеет ли устройство полный доступ к Интернету, т. Е. Что пользователь не ограниченпленник портала (также называемыйогороженный сад), т. е. ограниченная подсеть, которая вынуждает пользователей отправлять свои учетные данные в форме, чтобы получить полный доступ.

Мое приложение автоматизирует процесс аутентификации, и поэтому важно знать, что полный доступ в Интернет недоступен перед началом входа в систему.

Вопрос в томне о том, как проверить, что сетевой интерфейс работает и в подключенном состоянии. Речь идет о том, чтобы убедиться, что устройство имеет неограниченный доступ в Интернет, а не сегмент изолированной интрасети.

Все подходы, которые я пробовал до сих пор, терпят неудачу, потому что подключение к любому известному хосту не вызовет исключения, а вернет действительный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», который я использую, но это не похоже на правильное решение.

Ответы на вопрос(6)

Ваш ответ на вопрос