Как закрыть HttpsURLConnection Java - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь запросить данные с сервера, используя HttpsURLConnection;В настоящее время у меня есть сервер, требующий от пользователя ввода имени пользователя и пароля через приглашение.В веб-браузере после того, как вы введете правильное имя пользователя и пароль, браузер сохранит имя пользователя и пароль в виде файла cookie сеанса в вашем браузере, чтобы вы могли посещать другие страницы сайта без запроса ваших учетных данных.Но для клиента, который находится на Java, он не сохраняет имя пользователя и пароль.Я пытаюсь использовать .disconnect(), чтобы закрыть соединение, но получаю следующую ошибку:

java.lang.IllegalStateException: Already connected
at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:3053)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.setRequestProperty(HttpsURLConnectionImpl.java:316)

Мой код Java:

private static void sendPost(String _url) throws Exception {

    String url = _url;

    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    con.setRequestMethod("POST");

    int responseCode = con.getResponseCode();
    Auth(con);

    if (responseCode == 200) {
        label.setText("Sucssesfully Scanned: " + StudID.getText());
    } else {
        label.setText("Error, please scan again");
    }
    con.disconnect();
}

private static ArrayList<String> Get(String _url) throws Exception {
    ArrayList<String> list = new ArrayList<>();
    JsonParser parser = new JsonParser();

    String url = _url;

    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
    Auth(con);

    con.setRequestMethod("GET");

    con.setRequestProperty("Accept", "application/json");

    BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }

    in.close();
    con.disconnect();

    JsonElement element = parser.parse(response.toString());

    if (element.isJsonObject()) {
        JsonObject data = element.getAsJsonObject();
        for (int i = 0; i < data.get("chapels").getAsJsonArray().size(); i++) {
            JsonObject jObj = (JsonObject) data.get("chapels").getAsJsonArray().get(i);
            list.add(jObj.get("Name").toString().replaceAll("\"", "") + " - " + jObj.get("Loc").toString().replaceAll("\"", ""));
        }
    }

    return (list);
}
private static void Auth(HttpsURLConnection con){
    String encodedBytes = Base64.getEncoder().encodeToString((BCrypt.hashpw("swheeler17", BCrypt.gensalt(10)) + ":" + BCrypt.hashpw("Trinity", BCrypt.gensalt(10))).getBytes());
    con.setRequestProperty("authorization", "Basic " + encodedBytes);
}

Пример запроса имени пользователя и пароля:https://chapel -logs.herokuapp.com / часовня

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Основываясь на ответе Стивена С. Я определил порядок обмена следующим образом:

int responseCode = con.getResponseCode();
Auth(con);

Итак, рабочее решение:

Auth(con);
int responseCode = con.getResponseCode();

Я предполагаю, что ResponseCode() создаетзапрос к серверу, если запрос еще не сделан, в противном случае ResponseCode() использует уже существующий запрос.После дальнейшего тестирования я пришел к выводу, что нет необходимости звонить .disconnect().

0 голосов
/ 07 октября 2018

java.lang.IllegalStateException: уже подключено

Это исключение означает, что вы пытались установить свойство, дающее авторизацию для запроса после того, как оно было отправлено .

Это, вероятно, именно там, где это происходит:

    int responseCode = con.getResponseCode();
    Auth(con);

и Auth вызовы setRequestProperty.

Запрос кода ответа вызывает отправку запросаесли если еще не было отправлено.(Очевидно, что вы не можете получить код ответа, пока не получите ответ, и сервер не может дать вам его, если запрос не отправлен.)


Чтобы ответить на ваш вопрос, позвонитеdisconnect при соединении отключит соединение.

Но это не то, что вызывает вашу проблему.Трассировка стека ясно показывает, что исключение происходит, когда что-то вызывает setRequestProperty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...