Java: проблемы HttpURLConnection с IllegalStateArgument: уже подключен - PullRequest
9 голосов
/ 20 марта 2011

Этот вопрос кажется ясным, что происходит: у меня уже открыто соединение, проблема в том, что я не знаю почему.

Сейчас я просто проверяю свой логин http и выход.

Логин:

HttpURLConnection con = openConnection(URLGenerator.getLoginURL(), true, true,"POST");
        String content = ...;
        writeToOutput(con, content);
        con.connect();
        String cookieVal = con.getHeaderField("Set-Cookie");
        if(cookieVal != null)
        {
            sessionId = cookieVal.substring(0, cookieVal.indexOf(";"));
        }
        con.disconnect();
        return con.getResponseCode();

Выход из системы:

    HttpURLConnection con = openConnection(URLGenerator.getLogoutURL(), true, true,"GET");
    String content = ...;
    writeToOutput(con, content);
    setCookies(con);
    con.connect();
    con.disconnect();
    return con.getResponseCode();

и для любителей кода функция OpenConnection (потому что я знаю, что первое, что люди спросят, это "где этоfunction "

public static final HttpURLConnection openConnection(URL url, boolean in, boolean out,String requestMethode) throws IOException{
        HttpURLConnection con = (HttpURLConnection) url.openConnection ();
        con.setDoInput(in);
        con.setDoOutput (out);
        if(requestMethode == null){
            requestMethode = "GET";
        }
        con.setRequestMethod(requestMethode);
        con.setRequestProperty ("Content-Type", "application/x-www-form-urlencoded");
        return con;
    }

Это функция, которая вызывает java.lang.IllegalStateException: уже подключено

public static final void setCookies(HttpURLConnection con){
        if(sessionId != null)
        {
            con.setRequestProperty("Cookie", sessionId);
        }
    }

То, что я не понимаю, почемусоединение все еще открыто.

Я даже пытался вызвать отключение, но это не сработало.

Я думал, что основной задачей было настроить объект HttpURLConncetion и подключиться для выполнения запроса, получениярезультат и это разорвало соединение.

Есть идеи?

Спасибо Джейсон

1 Ответ

7 голосов
/ 20 марта 2011

Вам необходимо установить куки (значения заголовка запроса) до того, как вы напишете в тело запроса. Вы не можете больше изменять заголовки запроса при отправке первого бита тела запроса.

Итак, измени

writeToOutput(con, content);
setCookies(con);

до

setCookies(con);
writeToOutput(con, content);

и эта проблема должна исчезнуть.

...