搭建好的Solr服务,使用Java对其进行增删改查的时候都没有问题。后来出于安全考虑,对Solr配置了用户名及密码。配置完成后,查询时没有问题,但在新增和修改时,报 IOException occured when talking to server at: xxxxx异常。
在网上查了一下,说是配置完用户名和密码之后,需要修改原来的链接,所以我从网上找来子Java连接Solr的URL为"http://admin:123456@63.1.20.23:8090/solr/test_core"
结果还是不行。
后来,通过文档发现事情没这么简单,需要配置两个类,一个负责拦截,一个负责生成。
先发一下拦截器的代码:
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.AuthState;
import org.apache.http.auth.Credentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpCoreContext;
public class SolrAuthInterceptor implements HttpRequestInterceptor {
@Override
public void process(final HttpRequest request, final HttpContext context) {
AuthState authState = (AuthState) context.getAttribute(HttpClientContext.TARGET_AUTH_STATE);
if (authState.getAuthScheme() == null) {
CredentialsProvider provider =
(CredentialsProvider) context.getAttribute(HttpClientContext.CREDS_PROVIDER);
HttpHost httpHost = (HttpHost) context.getAttribute(HttpCoreContext.HTTP_TARGET_HOST);
AuthScope scope = new AuthScope(httpHost.getHostName(), httpHost.getPort());
Credentials credentials = provider.getCredentials(scope);
authState.update(new BasicScheme(), credentials);
}
}
}
接下来是HttpSolrClient的生成代码:
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import java.net.URI;
public class SolrConfig {
public static HttpSolrClient solrClient() {
CredentialsProvider provider = new BasicCredentialsProvider();
// 注意,这里的地址比较简单,不要按照网上说的那种加用户名和密码
final URI uri = URI.create("http://127.0.0.1:8983/solr/");
provider.setCredentials(new AuthScope(uri.getHost(), uri.getPort()),
new UsernamePasswordCredentials("admin", "123456"));
HttpClientBuilder builder = HttpClientBuilder.create();
// 刚才的拦截器,用于验证用户名和密码
builder.addInterceptorFirst(new SolrAuthInterceptor());
builder.setDefaultCredentialsProvider(provider);
CloseableHttpClient httpClient = builder.build();
// 注意,这里的地址比较简单,不要按照网上说的那种加用户名和密码
return new HttpSolrClient.Builder("http://127.0.0.1:8983/solr/").withHttpClient(httpClient).build();
}
}
使用的话就比较简单了:
static void add_new(){
String solrCore = "test_core";
HttpSolrClient solr = SolrConfig.solrClient();
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "1508");
document.addField("name", "测试-08");
document.addField("path", "/test/a8");
try{
solr.add(solrCore,document);
solr.commit(solrCore);
}catch (Exception e){
e.printStackTrace();
}
}
就这样吧!
我是来自 北京天码科技的卢泽。