面试题——跨域问题
-
跨域问题的原因:
由于浏览器的同源策略限制,同源策略是浏览器最核心也是最基本的安全功能,Web是构建在同源策略基础之上的。同源策略会阻止一个域的JS脚本和另一个域的内容进行交互。当一个请求的URL的协议、域名、端口三者之间任意一个与当前页面URL不同即为跨域1。 - 跨域解决方法:
- 设置
document.domain
解决无法读取非同源的Cookie问题:通过将两个页面的document.domain
设置为相同,可以实现Cookie的共享(仅限主域相同,子域不同的跨域应用场景)。 - **跨文档通信API
:ml-search[window.postMessage()]**‌:使用
postMessage`方法实现不同窗口或页面之间的消息传递,适用于页面和其打开的新窗口的数据传递、多窗口之间消息的传递、页面与嵌套的iframe消息传递等场景。 - JSONP:利用动态脚本标签
<script>
来绕过同源策略的限制,通过在请求参数中添加回调函数名,服务器返回执行结果并调用回调函数,实现跨域通信。但JSONP仅支持GET请求,且存在安全风险。 - CORS(跨域资源共享):CORS是一种W3C标准,通过在服务器端添加特定的HTTP响应头,允许浏览器从一个源访问另一个源的资源。CORS需要浏览器和服务器同时支持,但现代浏览器普遍支持CORS,因此主要是服务器端的实现问题。
- 反向代理:通过代理服务器接收请求后转发给目标服务器,并返回结果给浏览器,从而绕过浏览器的跨域限制。这种方法适用于服务器和服务器之间的通信,不涉及浏览器的直接限制。
- 设置
- CORS的实现:在服务器端,通过添加特定的HTTP响应头来实现CORS。例如,在Node.js环境中,可以通过设置
Access-Control-Allow-Origin
和Access-Control-Allow-Headers
等响应头来实现CORS23。 - JSONP的实现:
JSONP(JSON with Padding)是一种跨域请求数据的方式,它通过动态创建
<script>
标签请求一个带有回调函数的URL来实现。由于<script>
标签不受浏览器同源政策的限制,所以可以用来从不同域名的服务器上请求数据。JSONP的工作原理如下:
-
网页通过添加一个
<script>
标签来请求远程服务器上的JSON数据。 -
服务器接收请求,并返回一个执行回调函数的JavaScript语句。
-
网页中的回调函数被执行,并接收到服务器返回的JSON数据。
<!DOCTYPE html> <html> <head> <title>JSONP Example</title> </head> <body> <script> // 定义一个回调函数 function handleResponse(data) { console.log(data); // 这里将会输出从服务器返回的数据 } </script> <script src="https://example.com/api/data?callback=handleResponse"></script> </body> </html>
-
博观而约取