簡體   English   中英

Java HttpURLConnection 狀態碼 302

[英]Java HttpURLConnection status code 302

我試圖讓這個代碼塊運行,但我一直收到 302。我試圖展示代碼的流程。 我只是不知道怎么了。

import java.net.HttpURLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.Base64;

public class AuthenticateLoginLogoutExample {


public static void main(String[] args) throws Exception {
    new AuthenticateLoginLogoutExample().authenticateLoginLogoutExample(
                    "http://" + Constants.HOST + "/qcbin",
                    Constants.DOMAIN,
                    Constants.PROJECT,
                    Constants.USERNAME,
                    Constants.PASSWORD);
}

public void authenticateLoginLogoutExample(final String serverUrl,
      final String domain, final String project, String username,
      String password) throws Exception {

    RestConnector con =
            RestConnector.getInstance().init(
                    new HashMap<String, String>(),
                    serverUrl,
                    domain,
                    project);

    AuthenticateLoginLogoutExample example =
        new AuthenticateLoginLogoutExample();

    //if we're authenticated we'll get a null, otherwise a URL where we should login at (we're not logged in, so we'll get a URL).

當它從 isAuthenticated() 方法開始時就是下一行。

    String authenticationPoint = example.isAuthenticated();
    Assert.assertTrue("response from isAuthenticated means we're authenticated. that can't be.", authenticationPoint != null);

    //do a bunch of other stuff
}

所以我們進入 isAuthenticated 方法:

public String isAuthenticated() throws Exception {

    String isAuthenticateUrl = con.buildUrl("rest/is-authenticated");
    String ret;

然后在下一行嘗試獲得響應。 con.httpGet

    Response response = con.httpGet(isAuthenticateUrl, null, null);
    int responseCode = response.getStatusCode();

    //if already authenticated
    if (responseCode == HttpURLConnection.HTTP_OK) {

        ret = null;
    }

    //if not authenticated - get the address where to authenticate
    // via WWW-Authenticate
    else if (responseCode == HttpURLConnection.HTTP_UNAUTHORIZED) {

        Iterable<String> authenticationHeader =
                response.getResponseHeaders().get("WWW-Authenticate");

        String newUrl =
            authenticationHeader.iterator().next().split("=")[1];
        newUrl = newUrl.replace("\"", "");
        newUrl += "/authenticate";
        ret = newUrl;
    }

    //Not ok, not unauthorized. An error, such as 404, or 500
    else {

        throw response.getFailure();
    }

    return ret;
}

這將我們跳轉到另一個類並進入這個方法:

public Response httpGet(String url, String queryString, Map<String,
       String> headers)throws Exception {

    return doHttp("GET", url, queryString, null, headers, cookies);
}

doHttp 將我們帶到這里。 type = "GET", url = " http://SERVER/qcbin/rest/is-authenticated ",其余都是空的。

private Response doHttp(
        String type,
        String url,
        String queryString,
        byte[] data,
        Map<String, String> headers,
        Map<String, String> cookies) throws Exception {

    if ((queryString != null) && !queryString.isEmpty()) {

        url += "?" + queryString;
    }

    HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();

    con.setRequestMethod(type);
    String cookieString = getCookieString();

    prepareHttpRequest(con, headers, data, cookieString);

下一行的 con.connect() 永遠不會連接。

    con.connect();
    Response ret = retrieveHtmlResponse(con);

    updateCookies(ret);

    return ret;
}

prepareHttpRequest 代碼:

private void prepareHttpRequest(
        HttpURLConnection con,
        Map<String, String> headers,
        byte[] bytes,
        String cookieString) throws IOException {

    String contentType = null;

    //attach cookie information if such exists
    if ((cookieString != null) && !cookieString.isEmpty()) {

        con.setRequestProperty("Cookie", cookieString);
    }

    //send data from headers
    if (headers != null) {

        //Skip the content-type header - should only be sent
        //if you actually have any content to send. see below.
        contentType = headers.remove("Content-Type");

        Iterator<Entry<String, String>>
            headersIterator = headers.entrySet().iterator();
        while (headersIterator.hasNext()) {
            Entry<String, String> header = headersIterator.next();
            con.setRequestProperty(header.getKey(), header.getValue());
        }
    }

    // If there's data to attach to the request, it's handled here.
    // Note that if data exists, we take into account previously removed
    // content-type.
    if ((bytes != null) && (bytes.length > 0)) {

        con.setDoOutput(true);

        //warning: if you add content-type header then you MUST send
        // information or receive error.
        //so only do so if you're writing information...
        if (contentType != null) {
            con.setRequestProperty("Content-Type", contentType);
        }

        OutputStream out = con.getOutputStream();
        out.write(bytes);
        out.flush();
        out.close();
    }
}

和 getCookieString 方法:

public String getCookieString() {

    StringBuilder sb = new StringBuilder();

    if (!cookies.isEmpty()) {

        Set<Entry<String, String>> cookieEntries =
            cookies.entrySet();
        for (Entry<String, String> entry : cookieEntries) {
            sb.append(entry.getKey()).append("=").append(entry.getValue()).append(";");
        }
    }

    String ret = sb.toString();

    return ret;
}

有誰知道出了什么問題? 我不知道為什么它一直返回 302。

編輯:根據要求添加了 chrome 開發人員圖像。 在此處輸入圖片說明

我沒有遵循你的整個代碼,但 http 302 意味着重定向https://en.wikipedia.org/wiki/HTTP_302

根據重定向的類型,這可以順利或不順利。 例如,前幾天我遇到了 http 到 https 重定向,我必須手動檢查位置標頭來解決它。

我要做的是首先檢查瀏覽器中的標頭,在 Chrome 中轉到開發工具、網絡並檢查響應標頭(屏幕截圖)。 您應該在 302 響應中看到一個位置標頭,以及您應該遵循的新 URL。

在此處輸入圖片說明

302 意味着那里有一個頁面,但你真的想要一個不同的頁面(或者你想要這個頁面然后是另一個頁面)。 如果您查看從服務器返回 302 時返回的標頭,您可能會發現“位置:”標頭告訴您接下來要查詢的位置,並且您將不得不編寫另一個事務。

瀏覽器解釋 302 響應並自動重定向到“Location:”標頭中指定的 URL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM