24

最初に (Tomcat サーバー) 認証を必要とする 1 つのサイトにアクセスし、次に POST 要求でログインして、そのユーザーにサイトのページを表示させたいと考えています。私はHttpclient 4.0.1を使用しています

最初の認証は正常に機能しますが、このエラーについて常に不平を言うログオンではありません: "302 Moved Temporarily"

私はクッキーを保持し、コンテキストを保持していますが、何も保持していません。実際、間違ったパラメータや user||password を記述すると、ログイン ページが表示されるため、ログオンは機能しているようです。だから、うまくいかないのは自動リダイレクトだと思います。

私のコードに従うと、常にIOException、302がスローされます。

    DefaultHttpClient httpclient = new DefaultHttpClient();
    CookieStore cookieStore = new BasicCookieStore();
    httpclient.getParams().setParameter(
      ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY); 
    HttpContext context = new BasicHttpContext();
    context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    //ResponseHandler<String> responseHandler = new BasicResponseHandler();

    Credentials testsystemCreds = new UsernamePasswordCredentials(TESTSYSTEM_USER,  TESTSYSTEM_PASS);
    httpclient.getCredentialsProvider().setCredentials(
            new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
            testsystemCreds);

    HttpPost postRequest = new HttpPost(cms + "/login");
    List<NameValuePair> formparams = new ArrayList<NameValuePair>();
    formparams.add(new BasicNameValuePair("pUserId", user));
    formparams.add(new BasicNameValuePair("pPassword", pass));
    postRequest.setEntity(new UrlEncodedFormEntity(formparams, "UTF-8"));
    HttpResponse response = httpclient.execute(postRequest, context);
    System.out.println(response);

    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK)
        throw new IOException(response.getStatusLine().toString());

    HttpUriRequest currentReq = (HttpUriRequest) context.getAttribute( 
            ExecutionContext.HTTP_REQUEST);
    HttpHost currentHost = (HttpHost)  context.getAttribute( 
            ExecutionContext.HTTP_TARGET_HOST);
    String currentUrl = currentHost.toURI() + currentReq.getURI();        
    System.out.println(currentUrl);

    HttpEntity entity = response.getEntity();
    if (entity != null) {
        long len = entity.getContentLength();
        if (len != -1 && len < 2048) {
            System.out.println(EntityUtils.toString(entity));
        } else {
            // Stream content out
        }
    }
4

7 に答える 7

37

4.1 バージョンの場合:

DefaultHttpClient  httpclient = new DefaultHttpClient();
    httpclient.setRedirectStrategy(new DefaultRedirectStrategy() {                
        public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context)  {
            boolean isRedirect=false;
            try {
                isRedirect = super.isRedirected(request, response, context);
            } catch (ProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (!isRedirect) {
                int responseCode = response.getStatusLine().getStatusCode();
                if (responseCode == 301 || responseCode == 302) {
                    return true;
                }
            }
            return isRedirect;
        }
    });
于 2011-02-18T20:54:34.287 に答える
20

HttpClient 4.3.x の場合:

HttpClient httpClient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
于 2013-11-27T14:38:29.917 に答える
17

それ以降のバージョンのHttpCLient(4.1以降)では、次のようにすることができます。

DefaultHttpClient client = new DefaultHttpClient()
client.setRedirectStrategy(new LaxRedirectStrategy())

LaxRedirectStrategyは、HEAD、GET、およびPOSTリクエストを自動的にリダイレクトします。より厳密な実装には、DefaultRedirectStrategyを使用します。

于 2012-12-05T05:43:58.323 に答える
5

POST への応答がリダイレクトであることを示すカスタム リダイレクト ハンドラを実装する必要があります。これは、以下に示すように isRedirectRequested() メソッドをオーバーライドすることで実行できます。

DefaultHttpClient client = new DefaultHttpClient();
client.setRedirectHandler(new DefaultRedirectHandler() {                
    @Override
    public boolean isRedirectRequested(HttpResponse response, HttpContext context) {
        boolean isRedirect = super.isRedirectRequested(response, context);
        if (!isRedirect) {
            int responseCode = response.getStatusLine().getStatusCode();
            if (responseCode == 301 || responseCode == 302) {
                return true;
            }
        }
        return isRedirect;
    }
});

HttpClient の以降のバージョンでは、クラス名は DefaultRedirectStrategy ですが、そこでも同様のソリューションを使用できます。

于 2011-02-16T13:51:08.850 に答える
1

リダイレクトは、GET および PUT 以外のメソッドの場合、HttpClient 4.1 によって自動的に処理されません。

于 2011-10-25T20:46:29.167 に答える
1
httpclient.setRedirectHandler(new DefaultRedirectHandler());

HttpClient Javadocを参照してください。

于 2010-09-07T12:43:05.113 に答える