无法使用CORS下载文件

时间:2017-03-25 18:30:00

标签: html java-ee cors

我想发一个跨域请求,从我的java Web应用程序下载文件。我正在使用CORS过滤器并将配置包含在我的部署描述符(web.xml)中:

     <filter>
        <filter-name>CorsFilter</filter-name>
        <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
     </filter>
     <filter-mapping>
        <filter-name>CorsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
   <filter>

我在href属性中有跨域URL:

 <a href="http:localhost:8080/MyProject/downloadAction.action?fileId=1">download</a>

现在,当我单击该链接时,将重定向整个页面并下载该文件。我能知道怎样才能实现这个目标。 感谢

1 个答案:

答案 0 :(得分:1)

前一段时间我遇到过类似的问题。您将无法使用问题中提到的href属性使用GET请求下载文件。 相反,您可以按建议here提交嵌入在iframe中的表单,并将您的文件ID作为隐藏元素提交,并触发下载。所以你的锚标签应该是:

<a href="javascript:void(0)" onclick="downloadFile('+fileId+')">download</a>

现在将fileId作为参数传递给onclick JS函数,并将其定义如下:

 function downloadFile(fileId) {
    let $iframe, iframeDoc, iframeHtml;

    if(($iframe = $('#download_frame')).length === 0) {
    $iframe = $('<iframe id="download_frame" +
                ' style="display: none;" src="about:blank"></iframe>'
               ).appendTo('body');
    }

    iframeDoc= $iframe[0].contentWindow;
    if (iframeDoc.document) {
     iframeDoc= iframeDoc.document;
    }

    iframeHtml= '<html><head></head><body><form method="POST" action="http:localhost:8080/MyProject/downloadAction.action"><input type="hidden" name="fileId" value="'+fileId+'"></form></body></html>'; 

    iframeDoc.open();
    iframeDoc.write(iframeHtml);

    $(iframeDoc).find('form').submit();

}

您可以对单个或多个文件采用类似的方法。 另外,您可以在过滤器配置中的ur web.xml中包含此内容:

    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,X-Test-Header,Cache-Control
        </param-value>
    </init-param>
    <init-param>
        <param-name>cors.exposed.headers</param-name>
        <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials
        </param-value>
    </init-param>