0

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

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

response.setHeader("Access-Control-Allow-Origin", "*");

还有其他解决方法吗?

我找到了以下链接SOLR-1944

它通过将 HttpRequest 添加到 SolrRequest 而不是响应来解决。

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

请你指导我。

4

3 回答 3

1

我出于同样的目的使用 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>

此映射负责处理来自跨域的任何请求。

我希望这就是你要找的。

于 2013-10-10T21:08:42.853 回答
1

要解决跨域问题,您只需要包含 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;
});
于 2017-05-11T13:56:55.480 回答
0

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

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

官方文档链接

json.wrf=function - 在 JSON 响应周围添加一个包装函数,在 AJAX 中很有用,带有用于指定 JavaScript 回调函数的动态脚本标签。

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

  1. 在ajax中将数据类型更改为JSONP
  2. 在ajax中添加“jsonCallback:'callback'”
  3. 在查询 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 变量中。我们想要的数据是响应对象。

->mydata
Object {responseHeader: Object, response: Object}
->mydata["response"]
Object {numFound: 4916, start: 0, docs: Array[10]}
于 2015-05-01T02:32:06.610 回答