我无法向我的独立 solr 服务器发出跨域 ajax-json请求。
我希望在某处添加以下代码段,但找不到。
response.setHeader("Access-Control-Allow-Origin", "*");
还有其他解决方法吗?
我找到了以下链接SOLR-1944
它通过将 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>
此映射负责处理来自跨域的任何请求。
我希望这就是你要找的。
要解决跨域问题,您只需要包含 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;
});
这是一个老问题,但我刚刚在搜索中找到了一个新的简单答案。为了使用 CORS,一种简单的解决方案是获取 JSONP 文件。JSONP 的特别之处在于它被包装在一个函数中,并且服务器将假定它是一个脚本。在这种情况下,JSONP 可以忽略 CROS 规则。
但是,另一个问题是 Solr 不支持直接返回 JSONP。幸运的是,solr 在它的 JSON 解析器中有一个方法:
官方文档链接:
json.wrf=function - 在 JSON 响应周围添加一个包装函数,在 AJAX 中很有用,带有用于指定 JavaScript 回调函数的动态脚本标签。
在这种情况下,我们需要做的——简单的树步骤
一个简单的例子:
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]}