0

大家好,我在我的本地主机上有一个 xwiki,出于测试目的,我想通过编写一些简单的 jquery 脚本来测试 RESTful api:

<script type="text/javascript">

var username = "Admin";
var password ="admin";  

function make_base_auth(user, password) 
  {

    var tok = user + ':' + password;
    var hash = btoa(tok);
    alert(hash);
    return "Basic " + hash;

  }

var url = "http://localhost:8080/xwiki/rest/wikis/query?q=object:XWiki.XWikiUsers";
var returnData = "";
$.ajax({
    type: "GET",
    dataType: "xml",
    crossDomain: true,
    async: true,
    url: url,
     headers: {"authorization":  make_base_auth(username, password), "Access-Control-Allow-Origin": "*" },

    error: function(request, status, error) 
    {   
        alert(error) 
    },
    success: function(data) 
    {
       alert("success");

    }

       });    
</script>

我得到的错误是:

XMLHttpRequest 无法加载 http://localhost:8080/xwiki/rest/wikis/query?q=object:XWiki.XWikiUsers。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'null' 不允许访问。

但是与邮递员一起尝试我得到了正确的结果......我错过了什么?谢谢

4

2 回答 2

1

在默认配置中 XWiki 不允许 CORS;您需要在web.xml

要允许发送带有authentication标头的身份验证数据,请编辑文件 web.xml 并在带有过滤器的部分中添加一个新过滤器:

<filter>
  <filter-name>Set CORS headers very lenitent</filter-name>
  <filter-class>org.xwiki.container.servlet.filters.internal.SetHTTPHeaderFilter</filter-class>
  <init-param>
    <param-name>name</param-name>
    <param-value>Access-Control-Allow-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>value</param-name>
    <param-value>authorization</param-value>
  </init-param>
</filter>

现在您需要激活过滤器;在 s 中再往下filter-mapping添加你自己的:

<filter-mapping>
  <filter-name>Set CORS headers very lenitent</filter-name>
  <servlet-name>RestletServlet</servlet-name>
</filter-mapping>

(是的,如果您不喜欢过滤器名称,请使用不同的名称,只需在两个地方使用相同的名称即可。)

正如您在评论中发现的那样,允许多个 HTTP 标头的工作方式如下:

<filter>
  <filter-name>Set CORS headers very lenitent</filter-name>
  <filter-class>org.xwiki.container.servlet.filters.internal.SetHTTPHeaderFilter</filter-class>
  <init-param>
    <param-name>name</param-name>
    <param-value>Access-Control-Allow-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>value</param-name>
    <param-value>authorization, content-type</param-value>
  </init-param>
</filter>

(在这种情况下,允许authorization标头和“非标准”Content-Type标头)(旁注:标头不区分大小写:HTTP 标头是否区分大小写?

此外,您通常需要允许 CORS 用于 REST 请求;为此搜索:

<!-- We set the CORS policy globally for webjars.
   ... longer comment ....
  -->
<filter-mapping>
  <filter-name>Set CORS policy for fonts</filter-name>
  <servlet-name>resourceReferenceHandler</servlet-name>
  <url-pattern>/webjars/*</url-pattern>
  <url-pattern>*.woff</url-pattern>
  <url-pattern>*.eot</url-pattern>
  <url-pattern>*.ttf</url-pattern>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>FORWARD</dispatcher>
</filter-mapping>

编辑过滤器映射并添加一行<servlet-name>RestletServlet</servlet-name>以激活其余 servlet 的此过滤器:

<filter-mapping>
  <filter-name>Set CORS policy for fonts</filter-name>
  <servlet-name>resourceReferenceHandler</servlet-name>
  <servlet-name>RestletServlet</servlet-name>
  <url-pattern>/webjars/*</url-pattern>
  [...]

重新启动 servlet 容器后,AJAX 请求现在应该可以工作了。

于 2016-02-22T15:45:46.233 回答
0

您可以修改 web.xml 文件以启用 cors(我使用的是码头服务器)。我添加了下面提到的过滤器。

<filter>
      <filter-name>cross-origin</filter-name>
      <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
       <init-param>
         <param-name>allowedOrigins</param-name>
         <param-value>*</param-value>
       </init-param>
       <init-param>
         <param-name>allowedMethods</param-name>
         <param-value>GET,POST,DELETE,PUT,HEAD</param-value>
       </init-param>
       <init-param>
         <param-name>allowedHeaders</param-name>
         <param-value>origin, content-type, accept, authorization</param-value>
       </init-param>
  </filter>
  <filter-mapping>
     <filter-name>cross-origin</filter-name>
     <url-pattern>/*</url-pattern>
  </filter-mapping>

然后你需要从这里下载并添加 jetty servlet jar

将此 jar 放在 lib 文件夹中,然后重新启动服务器并为码头服务器启用 cors。

于 2020-03-12T13:05:24.003 回答