首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >写入操作时Solrj身份验证失败

写入操作时Solrj身份验证失败
EN

Stack Overflow用户
提问于 2014-09-15 23:59:39
回答 3查看 2.7K关注 0票数 2

只是在Jetty服务器上有密码保护的solr。我可以使用solrj读取/访问solr中的数据:->

代码语言:javascript
运行
复制
HttpSolrServer solr = new HttpSolrServer("http://111.111.111:8983/solr/mysolr");
   HttpClientUtil.setBasicAuth((DefaultHttpClient) solr.getHttpClient(), "admin", "akshaybhatt");

但它给了我I/O异常,如下所示。关于这个问题还有其他的例子

身份验证

但我不知道如何在Solrj中使用身份验证。下面的错误仅在我尝试更新记录(可能添加尚未测试的记录)时出现。

代码语言:javascript
运行
复制
org.apache.solr.client.solrj.SolrServerException: IOException occured when talking to server at: http://111.111.111.138:8983/solr/mysolrcore
    at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:507)
    at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:199)
    at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:118)
    at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:116)
    at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:102)
    at UpdateSolrTesting.AddToSolr(UpdateSolrTesting.java:228)
    at UpdateSolrTesting.performaction(UpdateSolrTesting.java:141)
    at UpdateSolrTesting.main(UpdateSolrTesting.java:101)
Caused by: org.apache.http.client.ClientProtocolException
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:867)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
    at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:395)
    ... 7 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:660)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:486)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
    ... 11 more
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-16 19:58:34

类似的问题已经问过了,你可以看看下面的链接来获得一些想法。

Solr -使用Httpclient实例化HttpSolrServer

Solr将CommonsHttpSolrServer更改为HttpSolrServer

票数 0
EN

Stack Overflow用户

发布于 2016-09-27 19:01:07

这仅仅是因为在执行POST或DELETE调用时没有发送身份验证参数,所以解决方案是您需要在http客户端中修复它。

我使用的是solr 6.2.0及其对应的java客户端

所以我创建了一个新的SolrHttp客户端,如下所示

代码语言:javascript
运行
复制
public class TEHttpSolrClient extends HttpSolrClient {

private static final String UTF_8 = StandardCharsets.UTF_8.name();

public TEHttpSolrClient(String baseURL) {
    super(baseURL);
}

@Override
public NamedList request(final SolrRequest request, String collection) throws SolrServerException, IOException {
    ResponseParser responseParser = request.getResponseParser();
    if (responseParser == null) {
        responseParser = parser;
    }
    return request(request, responseParser, collection);
}

public NamedList request(final SolrRequest request, final ResponseParser processor, String collection)
        throws SolrServerException, IOException {
    HttpRequestBase method = createMethod(request, collection);
    String userPass = ":";
    String encoded = Base64.byteArrayToBase64(userPass.getBytes(UTF_8));
    // below line will make sure that it sends authorization token every time in all your requests
    method.setHeader(new BasicHeader("Authorization", "Basic " + encoded));
    return executeMethod(method, processor);
}

}


Also to call the client you should call it like below

private static SolrClient solr = new TEHttpSolrClient.Builder("").build();
票数 3
EN

Stack Overflow用户

发布于 2021-03-01 19:29:18

您需要的是所谓的“抢占式身份验证”。这告诉http客户端在第一次调用url时进行身份验证。当使用基本身份验证时,默认行为是发送两个请求。当http调用中的实体不可重用时,这可能会失败,就像您的情况一样。

幸运的是,solr allready有一个内置的方法,可以通过使用不同的SolrHttpClientBuilder客户端构建工厂来启用抢占式身份验证。

代码语言:javascript
运行
复制
String userName = "someUserName";
String password = "secretPassword";

ModifiableSolrParams params = new ModifiableSolrParams();
params.set(HttpClientUtil.PROP_BASIC_AUTH_USER, userName);
params.set(HttpClientUtil.PROP_BASIC_AUTH_PASS, password);

// set the params for authentication here
PreemptiveBasicAuthClientBuilderFactory.setDefaultSolrParams(params);
PreemptiveBasicAuthClientBuilderFactory preemptiveBasicAuthClientBuilderFactory = new PreemptiveBasicAuthClientBuilderFactory();

// create a new client builder from the preemptive client builder factory
SolrHttpClientBuilder httpClientBuilder = preemptiveBasicAuthClientBuilderFactory
            .getHttpClientBuilder(Optional.empty());

// set the client builder to be used by the clientUtil 
HttpClientUtil.setHttpClientBuilder(httpClientBuilder);

// the params need to be passed here too
CloseableHttpClient httpAuthClient = HttpClientUtil.createClient(params);

// now build the solr client with the special http client
Builder solrClientBuilder = new HttpSolrClient.Builder(solrClientConfig.getSolrUrl()).withHttpClient(httpAuthClient);

// create solr client
SolrClient client = solrClientBuilder.build();

记住不要在请求级别设置授权参数,否则抢占式身份验证将不起作用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25852164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档