javascript Access-Control-Allow-Origin不允许源为空

apeeds0o  于 2023-01-29  发布在  Java
关注(0)|答案(8)|浏览(215)

我创建了一个小的xslt文件来创建一个名为weather. xsl的html输出,代码如下:

<!-- DWXMLSource="http://weather.yahooapis.com/forecastrss?w=38325&u=c" -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="yweather"
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <img src="{/*/*/item/yweather:condition/@text}.jpg"/>
</xsl:template>
</xsl:stylesheet>

我想将html输出加载到html文件的div中,我尝试使用jQuery执行此操作,如下所示:

<div id="result">
<script type="text/javascript">
$('#result').load('weather.xsl');
</script>
</div>

但我得到了以下错误:访问控制允许来源不允许来源为空。
我读过关于在xslt中添加一个头的文章,但是我不知道怎么做,所以任何帮助都将是感激的,如果在html输出中加载不能这样做,那么关于如何做的建议将是伟大的。

2hh7jdfx

2hh7jdfx1#

Origin null是本地文件系统,因此这意味着您正在通过file:/// URL加载执行load调用的HTML页面(例如,只需在本地文件浏览器或类似的浏览器中双击它)。
大多数浏览器将Same Origin Policy应用于本地文件,甚至不允许从与文档相同的目录加载文件。(过去Firefox允许相同的目录和子目录,但现在不允许了。
基本上,使用 AJAX 和本地资源是行不通的。
如果您只是在本地测试一些您将真正部署到Web上的东西,而不是使用本地文件,安装一个简单的Web服务器,然后通过http://URL进行测试,这样可以更准确地了解安全性。IDE很可能内置了某种服务器(直接或通过扩展),您只需在IDE中单击“运行”,就可以启动服务器并提供文件。

kt06eoxx

kt06eoxx2#

Chrome和Safari对 AJAX 使用本地资源有限制,这就是为什么它会抛出这样的错误

  • 访问控制允许原点不允许原点为空。*
    **解决方案:**使用firefox或将您的数据上传到临时服务器。如果您仍然想使用Chrome,请使用以下选项启动它;
--allow-file-access-from-files

**更多信息如何添加上述参数到您的Chrome浏览器:**右键单击任务栏上的Chrome浏览器图标,右键单击弹出窗口中的Google Chrome浏览器,然后单击属性,并将上述参数添加到快捷方式选项卡下的目标文本框中。

C:\Users\XXX_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

希望这会有帮助!

6ojccjat

6ojccjat3#

我只想补充一点,“运行一个Web服务器”的答案似乎相当令人生畏,但如果你的系统上有python(默认情况下至少安装在MacOS和任何Linux发行版上),它就像这样简单:

python -m http.server  # with python3

python -m SimpleHTTPServer  # with python2

因此,如果您的html文件myfile.html在一个文件夹中,比如mydir,您所要做的就是:

cd /path/to/mydir
python -m http.server  # or the python2 alternative above

然后将浏览器指向:

http://localhost:8000/myfile.html

这样就大功告成了!适用于所有浏览器,无需禁用网络安全,允许本地文件,甚至无需使用命令行选项重新启动浏览器。

piv4azn7

piv4azn74#

我想谦虚地补充说,根据这一SO来源:https://stackoverflow.com/a/14671362/1743693,现在只需使用下面的jQuery指令就可以部分解决这种问题:

<script> 
    $.support.cors = true;
</script>

我在IE10.0.9200上试用了它,它立即工作了(使用jquery-1.9.0.js)。

在chrome 28.0.1500.95上--这个指令不起作用(david在上面链接的评论中抱怨说这种情况到处都有)
使用--allow-file-access-from-files运行chrome对我来说不起作用(正如Maistora在上面所说的)

esyap4oy

esyap4oy5#

添加一点使用Gokhan的解决方案使用:

--allow-file-access-from-files

现在你只需要在目标文本中添加上面的文本,后面跟一个空格。添加上述属性后,请确保关闭chrome浏览器的所有示例。现在通过添加此属性的图标重新启动chrome。它应该对所有示例都有效。

mec1mxoz

mec1mxoz6#

我正在寻找一个从本地HTML文件向服务器发出XHR请求的解决方案,并找到了一个使用Chrome和PHP的解决方案。(没有Jquery)
Javascript:

var x = new XMLHttpRequest(); 
if(x) x.onreadystatechange=function(){ 
    if (x.readyState === 4 && x.status===200){
        console.log(x.responseText); //Success
    }else{ 
        console.log(x); //Failed
    }
};
x.open(GET, 'http://example.com/', true);
x.withCredentials = true;
x.send();

我的Chrome浏览器的请求标头Origin: null
我的PHP响应头(注意'null'是一个字符串)。HTTP_REFERER允许从一个远程服务器到另一个服务器的跨源。

header('Access-Control-Allow-Origin: '.(trim($_SERVER['HTTP_REFERER'],'/')?:'null'),true);
header('Access-Control-Allow-Credentials:true',true);

我能够成功连接到我的服务器。您可以忽略Credentials标头,但在启用Apache的AuthType Basic时,这对我有效
我测试了与FF和Opera的兼容性,它在许多情况下工作,如:
从虚拟机LAN IP(192.168.0.x)返回到虚拟机的WAN(公共)IP:端口
从VM LAN IP返回到远程服务器域名。
从本地.HTML文件到VM LAN IP和/或VM WAN IP:端口,
从本地.HTML文件转换为远程服务器域名。
等等。

pprl5pva

pprl5pva7#

您可以使用source标记加载本地Javascript文件(在file:/源代码页面下的树中):

<script src="my_data.js"></script>

如果您将输入编码为Javascript,例如:

我的数据.js

$xsl_text = "<xsl:stylesheet version="1.0" + ....

(this对于json来说更容易),那么您就可以在Javascript全局变量中使用“data”,以便根据需要使用。

flseospp

flseospp8#

使用Java Spring来运行Web服务,您需要添加:@ServletComponentScan,位于自动生成的YouAppApplication.java文件(带有main()函数的文件)中@SpringBootApplication的正上方,并使用以下实现创建一个类:

@WebFilter("/*")
public class AddResponseHeaderFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // ...
    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
        httpServletResponse.addHeader("Access-Control-Allow-Origin", "null");

        httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true");
         filterChain.doFilter(servletRequest, servletResponse);

    }

    @Override
    public void destroy() {
        // ...
    }
}

请注意,只要该类实现了Filter并具有@WebFilter注解,您就可以为该类选择不同的名称。您还可以提供与/*不同的通配符,以便此Filter不适用于每个端点。
正如@ LouisLoudogTrottier所指定的,在创建 AJAX 请求时需要添加...withCredentials = true;才能使其工作。

相关问题