Java 使用SolrJ设置自定义请求头

Java 使用SolrJ设置自定义请求头,java,solr,solrj,Java,Solr,Solrj,我在Solr中配置了一个自定义http过滤器,它首先被调用(在org.apache.Solr.servlet.SolrDispatchFilter之前执行),用于处理到达Solr的每个请求。自定义筛选器在所有传入的solr请求中查找特定的请求头,并且仅当其存在时,才会将其发送给solr进行进一步处理 我使用SolrJ进行某些查询。在查询Solr到SolrJ时,有没有办法设置HTTP请求头 My Solr and SorlJ版本为5.4.0您可以扩展HttpSolrClient创建自己的类MyHt

我在Solr中配置了一个自定义http过滤器,它首先被调用(在org.apache.Solr.servlet.SolrDispatchFilter之前执行),用于处理到达Solr的每个请求。自定义筛选器在所有传入的solr请求中查找特定的请求头,并且仅当其存在时,才会将其发送给solr进行进一步处理

我使用SolrJ进行某些查询。在查询Solr到SolrJ时,有没有办法设置HTTP请求头


My Solr and SorlJ版本为5.4.0

您可以扩展
HttpSolrClient
创建自己的类
MyHttpSolrClient
,并自定义添加自定义请求头的
executeMethod
行为

public class MyHttpSolrClient extends HttpSolrClient {

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

  public MyHttpSolrClient(String baseURL, HttpClient client) {
    super(baseURL, client);
  }

  public MyHttpSolrClient(String baseURL, HttpClient client, ResponseParser parser) {
    super(baseURL, client, parser);
  }

  protected NamedList<Object> executeMethod(HttpRequestBase method, final ResponseParser processor) throws SolrServerException {

    // **Here you add your custom header**
    method.addHeader("Name", "Value");

    return super.executeMethod(method, processor);
  }
}
公共类MyHttpSolrClient扩展了HttpSolrClient{
公共MyHttpSolrClient(字符串baseURL){
super(baseURL);
}
公共MyHttpSolrClient(字符串baseURL,HttpClient客户端){
super(baseURL,客户端);
}
公共MyHttpSolrClient(字符串baseURL、HttpClient客户端、ResponseParser解析器){
super(baseURL、客户端、解析器);
}
受保护的NamedList executeMethod(HttpRequestBase方法,最终响应资源处理器)引发SolrServerException{
//**在此处添加自定义标题**
方法addHeader(“名称”、“值”);
返回super.executeMethod(方法、处理器);
}
}

您可以扩展
HttpSolrClient
创建自己的类
MyHttpSolrClient
,并自定义添加自定义请求头的
执行方法的行为

public class MyHttpSolrClient extends HttpSolrClient {

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

  public MyHttpSolrClient(String baseURL, HttpClient client) {
    super(baseURL, client);
  }

  public MyHttpSolrClient(String baseURL, HttpClient client, ResponseParser parser) {
    super(baseURL, client, parser);
  }

  protected NamedList<Object> executeMethod(HttpRequestBase method, final ResponseParser processor) throws SolrServerException {

    // **Here you add your custom header**
    method.addHeader("Name", "Value");

    return super.executeMethod(method, processor);
  }
}
公共类MyHttpSolrClient扩展了HttpSolrClient{
公共MyHttpSolrClient(字符串baseURL){
super(baseURL);
}
公共MyHttpSolrClient(字符串baseURL,HttpClient客户端){
super(baseURL,客户端);
}
公共MyHttpSolrClient(字符串baseURL、HttpClient客户端、ResponseParser解析器){
super(baseURL、客户端、解析器);
}
受保护的NamedList executeMethod(HttpRequestBase方法,最终响应资源处理器)引发SolrServerException{
//**在此处添加自定义标题**
方法addHeader(“名称”、“值”);
返回super.executeMethod(方法、处理器);
}
}

对此解决方案有何想法

// somewhere in my client initialization code
HttpRequestInterceptor interceptor = (HttpRequest request, HttpContext context) -> {
        request.addHeader("myheadername", "myheadervalue");
};

HttpClientUtil.addRequestInterceptor(interceptor);
HttpSolrClient solrClient = new HttpSolrClient.Builder(serverUrl).build();
我的问题/顾虑与
HttpClientUtil
()

这依赖于内部HttpClient实现,并受 改变

警告:此API是实验性的,可能会在 下一版本中的不兼容方式


我还对我创建的任何后续客户端实例的任何延迟影响提出了问题/担忧。这些实例也会配置相同的拦截器吗?我能做些什么来确保他们不会这样做吗?

关于这个解决方案的想法

// somewhere in my client initialization code
HttpRequestInterceptor interceptor = (HttpRequest request, HttpContext context) -> {
        request.addHeader("myheadername", "myheadervalue");
};

HttpClientUtil.addRequestInterceptor(interceptor);
HttpSolrClient solrClient = new HttpSolrClient.Builder(serverUrl).build();
我的问题/顾虑与
HttpClientUtil
()

这依赖于内部HttpClient实现,并受 改变

警告:此API是实验性的,可能会在 下一版本中的不兼容方式

我还对我创建的任何后续客户端实例的任何延迟影响提出了问题/担忧。这些实例也会配置相同的拦截器吗?我能做些什么来确保他们不会