3

Я пытаюсь подключиться к solr, используя solrj. Мой экземпляр solr работает в причале и защищен базовой аутентификацией. Я нашел эти ссылки, содержащие релевантную информацию.Solr 4 с базовой аутентификацией

http://grokbase.com/t/lucene/solr-user/1288xjjbwx/http-basic-authentication-with-httpsolrserver

Preemptive Basic authentication with Apache HttpClient 4 Однако, я все еще получаю следующее исключение:

Caused by: org.apache.http.client.ClientProtocolException 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:822) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732) 
at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:352) 
... 5 more 
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity. 
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:625) 
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464) 
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) 
... 8 more 

Я также прилагается фрагмент кода я использую.

public static void main(String[] args) throws SolrServerException, IOException { 

    HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/"); 

    DefaultHttpClient m_client =(DefaultHttpClient)server.getHttpClient(); 
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(USERNAME, PASSWORD); 

    m_client.addRequestInterceptor(new PreemptiveAuthInterceptor(),0); 
    (((DefaultHttpClient)m_client).getCredentialsProvider()).setCredentials(new AuthScope("localhost",8983), credentials); 

    SolrInputDocument document = new SolrInputDocument(); 
    document.addField("id",123213); 
    server.add(document); 
    server.commit(); 

} 

}

class PreemptiveAuthInterceptor implements HttpRequestInterceptor { 

    public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException { 
     AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE); 

     // If no auth scheme avaialble yet, try to initialize it 
     // preemptively 
     if (authState.getAuthScheme() == null) { 
      AuthScheme authScheme = (AuthScheme) context.getAttribute("preemptive-auth"); 
      CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(ClientContext.CREDS_PROVIDER); 
      HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST); 
      if (authScheme != null) { 
       Credentials creds = credsProvider.getCredentials(new AuthScope(targetHost.getHostName(), targetHost.getPort())); 
       if (creds == null) { 
        throw new HttpException("No credentials for preemptive authentication"); 
       } 
       authState.setAuthScheme(authScheme); 
       authState.setCredentials(creds); 
      } 
     } 

    } 

Может кто-нибудь мне точку в правильном направлении? Благодаря !!

+0

вы можете также показать на стороне сервера исключение? –

+0

Спасибо D_K. Исключений на стороне сервера нет. – Dash

+0

Смотрите следующую ссылку: - [http://stackoverflow.com/questions/2014700/preemptive-basic-authentication-with-apache-httpclient-4/29012443#29012443][1] [ 1]: http://stackoverflow.com/questions/2014700/preemptive-basic-authentication-with-apache-httpclient-4/29012443#29012443 –

ответ

6

я была такая же проблема при реализации частичного обновления документов. Я решил проблему, выполнив PreemptiveAuthInterceptor. см ниже код

PoolingClientConnectionManager cxMgr = new PoolingClientConnectionManager(
         SchemeRegistryFactory.createDefault()); 
       cxMgr.setMaxTotal(100); 
       cxMgr.setDefaultMaxPerRoute(20); 

       DefaultHttpClient httpclient = new DefaultHttpClient(cxMgr); 
       httpclient.addRequestInterceptor(
         new PreemptiveAuthInterceptor(), 0); 
       httpclient.getCredentialsProvider().setCredentials(
         AuthScope.ANY, 
         new UsernamePasswordCredentials(solrDto.getUsername(), 
           solrDto.getPassword())); 

       HttpSolrServer solrServerInstance = new HttpSolrServer(solrDto.getUrl(), 
         httpclient); 
       solrServerInstance.setRequestWriter(new BinaryRequestWriter()); 
       solrServerInstance.setAllowCompression(true); 

Кроме того, необходимо:

private class PreemptiveAuthInterceptor implements HttpRequestInterceptor { 

      public void process(final HttpRequest request, final HttpContext context) 
        throws HttpException, IOException { 
       AuthState authState = (AuthState) context 
         .getAttribute(ClientContext.TARGET_AUTH_STATE); 

       // If no auth scheme avaialble yet, try to initialize it 
       // preemptively 
       if (authState.getAuthScheme() == null) { 
        CredentialsProvider credsProvider = (CredentialsProvider) context 
          .getAttribute(ClientContext.CREDS_PROVIDER); 
        HttpHost targetHost = (HttpHost) context 
          .getAttribute(ExecutionContext.HTTP_TARGET_HOST); 
        Credentials creds = credsProvider.getCredentials(new AuthScope(
          targetHost.getHostName(), targetHost.getPort())); 
        if (creds == null) 
         throw new HttpException(
           "No credentials for preemptive authentication"); 
        authState.setAuthScheme(new BasicScheme()); 
        authState.setCredentials(creds); 
       } 

      } 

     } 
0

Согласно разделу на Solr Wiki Solr Security - SolrJ вы должны быть в состоянии сделать следующее:

public static void main(String[] args) throws SolrServerException, IOException { 

    HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/"); 

    HttpClientUtil.setBasicAuth(server.getHttpClient(), USERNAME, PASSWORD); 

    SolrInputDocument document = new SolrInputDocument(); 
    document.addField("id",123213); 
    server.add(document); 
    server.commit(); 

} 
+0

Спасибо Paige. Я все равно получаю то же исключение. Я думаю, причина в том, что нам нужно установить preemptiveauthentication в true. – Dash

0

Вам нужно добавить JAR solr-solrj-4.0.0.jar для HttpClientUtil.

Затем используйте следующий код:

HttpSolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/"+url);  
HttpClientUtil.setBasicAuth((DefaultHttpClient) solrServer.getHttpClient(), "USERNAME", "PASSWORD"); 

Это работало для меня на JDK 1.6 и 6

кот
Смежные вопросы