0

web.xml のダイジェスト認証で保護した solr サーバーがあり、java から solr を呼び出す必要があります。今日はたくさんのスレッドを読み、多くの例を実行しましたが、うまくいきませんでした。

私はこのコードを commons-httpclient 3.1 で動作させており、200 OK を取得しています。

    URL url = new URL(solrUrl);

    HttpClient httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
    httpClient.getState().setCredentials(new AuthScope(url.getHost(), url.getPort(), AuthScope.ANY_SCHEME),
            new UsernamePasswordCredentials(user, password));

    HttpMethod method = new GetMethod(solrUrl);
    int responseCode = httpClient.executeMethod(method);
    System.out.println(responseCode);

しかし、apache httpcomponent 4.2.2 でそれを実行しようとすると、常に 401 が無許可になります。これは公式の例とほぼ同じです。

       DefaultHttpClient httpclient = null;
    try
    {
        URL url = new URL(solrUrl);
        HttpHost targetHost = new HttpHost(url.getHost(), url.getPort(), url.getProtocol());
        httpclient = new DefaultHttpClient();
        UsernamePasswordCredentials creds = new UsernamePasswordCredentials(user, password);
        httpclient.getCredentialsProvider().setCredentials(
                new AuthScope(targetHost.getHostName(),targetHost.getPort()),
                creds);


        HttpGet httpget = new HttpGet(solrUrl);
        HttpResponse response = httpclient.execute(targetHost,httpget);
        HttpEntity entity = response.getEntity();
        System.out.println(response.getStatusLine());
        EntityUtils.consume(entity);

        httpget.releaseConnection();


    } catch (ClientProtocolException e)
    {
        e.printStackTrace();
    } catch (IOException e)
    {
        e.printStackTrace();
    }  finally
    {
        httpclient.getConnectionManager().shutdown();
    }

また、HttpUrlConnection を使用して、常に同じ 401 を取得しようとしました。

Authenticator authenticator = new Authenticator()
    {
        protected PasswordAuthentication getPasswordAuthentication()
        {
            PasswordAuthentication pa = new PasswordAuthentication(user, password.toCharArray());
            System.out.println("calling solr with user:pass " + pa.getUserName() + ":******");
            return pa;
        }
    };

    Authenticator.setDefault(authenticator);
    try
    {
        URL url = new URL(solrUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("type", "submit");
        conn.setDoOutput(true);

        conn.connect();
    System.out.println( conn.getResponseCode());


        conn.disconnect();
    } catch (MalformedURLException mue)
    {
        mue.printStackTrace();
    } catch (IOException ioe)
    {
        ioe.printStackTrace();
    } catch (Exception e)
    {
        e.printStackTrace();
    }

クラスパスの問題でapache httpcomponents 4を使いたいのですが、断念中です..

助けはありますか?

4

1 に答える 1

1

自分に答える: どうやら、jdk + tomcat のバグの組み合わせに遭遇したようです:

Java バグ

トムキャットのバグ

jdk 1.6.0_45-b06 と tomcat 7.0.34 で発生し、tomcat を 7.0.41 にアップグレードすると修正されました。

于 2013-07-01T02:20:44.937 に答える