Json Solr跨域ajax请求失败:允许访问HttpResponse头的API插件?

Json Solr跨域ajax请求失败:允许访问HttpResponse头的API插件?,json,solr,Json,Solr,我无法向我的独立solr服务器发出跨域ajax json请求 我希望在某处添加以下代码片段,但找不到 response.setHeader("Access-Control-Allow-Origin", "*"); 还有其他解决办法吗 我找到了以下链接 通过将HttpRequest添加到SolrRequest而不是响应来解决此问题 用户提到他通过定制SolrDispatchFilter解决了这个问题,但不知道如何解决 请您指导我。我正在使用CORS(跨来源资源共享)来实现同样的目的。跟随为我工作

我无法向我的独立solr服务器发出跨域ajax json请求

我希望在某处添加以下代码片段,但找不到

response.setHeader("Access-Control-Allow-Origin", "*");
还有其他解决办法吗

我找到了以下链接

通过将HttpRequest添加到SolrRequest而不是响应来解决此问题

用户提到他通过定制SolrDispatchFilter解决了这个问题,但不知道如何解决

请您指导我。

我正在使用CORS(跨来源资源共享)来实现同样的目的。跟随为我工作

public class DomainFilter implements Filter {

    private static Log log = LogFactory.getLog(DomainFilter.class);


    public DomainFilter() {
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("Entering doFilter method------");
        HttpServletResponse responsee = (HttpServletResponse) response;
        responsee.addHeader("Access-Control-Allow-Origin", "*");
        responsee.addHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, DELETE, PUT");
        responsee.addHeader("Access-Control-Allow-Headers", 
            "X-Requested-With,Host,Content-Type,User-Agent,Accept,Accept-Language,Accept-Encoding,Accept-Charset,Keep-Alive,Connection,Referer,Origin");
        // pass the request along the filter chain
        chain.doFilter(request, response);
        log.info("Exiting doFilter method------");
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
    }

}
您还需要在web.xml中添加过滤器映射

<filter>
    <display-name>DomainFilter</display-name>
    <filter-name>DomainFilter</filter-name>
    <filter-class>com.mathworks.trdbsearch.search.DomainFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>DomainFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

域过滤器
域过滤器
com.mathworks.trdbsearch.search.DomainFilter
域过滤器
/*
此映射处理来自跨域的任何请求


我希望这就是你想要的。

这是一个老问题,但我刚刚在搜索中找到了一个新的简单答案。 为了使用CORS,一个简单的解决方案是获取JSONP文件。JSONP的特殊之处在于它被包装在一个函数中,服务器将假定它是一个脚本。在这种情况下,JSONP可以忽略CROS规则

然而,另一个问题是Solr不支持直接返回JSONP。幸运的是,solr的JSON解析器中有一个方法:

官方文件:

wrf=function—在json响应周围添加一个包装函数,在AJAX中使用动态脚本标记指定JavaScript回调函数非常有用

在这种情况下,我们需要做的是——简单的树步骤

  • 在ajax中将数据类型更改为JSONP
  • 在ajax中添加“jsonCallback:'callback'”
  • 在查询URL的末尾,添加“json.wrf=callback”
  • 一个简单的例子:

    var queryurl = "http://localhost:8983/solr/test/select?q=How+does+this+js+know%0A&wt=json&json.wrf=callback&indent=true"
    $.ajax({
      url: queryurl,
      crossDomain: true,
      dataType:'jsonp',
      jsonpCallback: 'callback'
    }).done(function(data) {
        mydata = data;
    });
    
    然后我返回的数据存储在mydata Variable中。我们需要的数据是响应对象

    ->mydata
    Object {responseHeader: Object, response: Object}
    ->mydata["response"]
    Object {numFound: 4916, start: 0, docs: Array[10]}
    

    要解决跨域问题,只需包含json.wrf=?到solr查询的末尾

    var queryurl = "http://localhost:8983/solr/test/select?q=How+does+this+js+know%0A&wt=json&json.wrf=?"
    
    $.getJSON(queryurl, function(results) {
        var totalPages = results.response.numFound;
    });
    

    请你澄清一下你说的是哪一个“web.xml”好吗?是索尔的吗?