action
控制器中的domain1
:
def show
respond_to do |format|
format.html
format.js { render js: 'alert("Foo")' }
end
end
当我在js
视图中调用domain2
格式时,警报会正常工作。
<script type="text/javascript" src="http://domain1/action.js"></script>
但是,由于js script
提供了domain1
,我原以为它不起作用。
我认为这是跨域请求。我错了?
如何在Rails中阻止它(使用cors - 我不考虑身份验证)?
请求标题:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:language=en; JSESSIONID=548BBE8340E2BCF88CC79FD406D87201; _session_id=36e9c1d96dd60d139edc669e4eb5311a
Host:domain1
If-None-Match:"4160518da6c411ed4f844684e3bd82e8"
Referer:https://domain2/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36
响应标题:
Cache-Control:max-age=0, private, must-revalidate
Content-Length:13
Content-Security-Policy:default-src * 'unsafe-inline' 'unsafe-eval'; connect-src * 'unsafe-inline' 'unsafe-eval'; font-src * 'unsafe-inline' 'unsafe-eval'; frame-src * 'unsafe-inline' 'unsafe-eval'; img-src * 'unsafe-inline' 'unsafe-eval' data:; media-src * 'unsafe-inline' 'unsafe-eval'; object-src * 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval'; style-src * 'unsafe-inline' 'unsafe-eval';
Content-Type:text/javascript; charset=utf-8
Date:Thu, 02 Jul 2015 14:36:17 GMT
Etag:"68a0bef3fb4d7408f31dfd3d2958cb4d"
Server:WEBrick/1.3.1 (Ruby/1.9.3/2013-11-22)
Strict-Transport-Security:max-age=631138519
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-Request-Id:136ef12c007055e756e4ac1b7de83046
X-Runtime:0.264848
X-Ua-Compatible:IE=Edge
X-Xss-Protection:1
答案 0 :(得分:2)
您可以包含来自任何域的代码,这就是谷歌地图等图书馆的工作方式。
您在中在JavaScript中执行的操作是向其他域发出(XMLHTTP)请求,除非这些域具有允许您的域的原始策略。
包含脚本不被视为跨域请求(这也是JSONP解决原始限制的方式)。输出CORS策略不会停止请求。
关于如何阻止请求。这取决于你的情况。如果您将脚本作为API套件的一部分提供,最好的办法是使用身份验证令牌。