浏览器同源策略、跨域、跨域请求,服务器处理没、跨域解决方案

目录

什么是同源策略

概念:

同源策略是浏览器的一种安全机制,用于防止恶意网站对用户的敏感数据进行未经授权的访问。它限制了从一个源加载的脚本对另一个源的资源进行访问。 简单来说,同源策略规定只有当两个页面的协议、域名和端口都相同时,它们才属于同一个源,允许相互访问资源

好处:

  1. 保护用户数据安全,不同源的脚本无法访问另一个源的Cookie、LocalStorage、SessionStorage
  2. 不同源的脚本无法读取或操作另一个源的Dom
  3. 跨源的XMLHttpRequest或Fetch请求会被浏览器阻止,除非目标服务器允许(使用CORS)

什么是跨域

当一个网页试图访问不同来源的资源(如API、图片、脚本、数据等),就会发生跨域,常说的跨域指的是ajax调用接口时的跨域,浏览器会根据同源策略来判断来源是否一致,如果不一致就认为是跨域请求。如果服务器没有做一些配置,那么跨域请求会失败。

发生跨域时,服务器有没有接到请求并处理响应:(两种情况)

  1. 简单请求:
    1. 使用的方法是get、post时
    2. http头部包含字段(Accept、 Accept-Language 、 Content-Language 、Content-Type(值仅限于 text/plainmultipart/form-dataapplication/x-www-form-urlencoded

服务器会收到请求并处理该请求返回响应,如果服务器并没有设置跨域的响应头(如Access-Control-Allow-Origin),浏览器会阻止前端代码访问响应数据,但服务器已经执行了请求逻辑

  1. 复杂请求:
    1. put、delete等方法
    2. 包含自定义的请求头(如 AuthorizationX-Custom-Header) 、Content-Type 的值是非简单值(如 application/json

预检请求机制,在发送复杂请求之前,浏览器会自动发起一个OPTIONS预检请求。如果预检请求通过,浏览器会发送实际请求,如果预检失败,浏览器会直接阻止请求发送。

如何解决跨域

  1. 我们项目使用的是代理服务器解决跨域问题,跨域问题是存在于浏览器和服务器之间,服务器和服务器之间是不存在跨域问题的。
  • 开发环境通过Vue配置代理服务器。在vue.config.js中添加devServer.proxy配置。将项目dev-api开头的请求转发到项目后台服务器上
js 复制代码
module.exports = {
  devServer: {
    proxy: {
      // 代理 `/api` 开头的请求
      '/dev-api': {
        target: 'http://example.com', // 目标服务器地址
      },
    },
  },
};
  • 生产环境是通过nginx配置反向代理,在nginx的conf配置文件中配置将prod-api开头的请求转发到项目后台服务器上。
javascript 复制代码
location /prod-api  {
  proxy_pass https://heimahr-t.itheima.net;
}
  1. 使用CORS,服务器设置特定的http响应头,告诉浏览器哪些跨域请求是被允许的。
javascript 复制代码
在服务器端添加以下响应头:
Access-Control-Allow-Origin: 指定允许访问的来源(如 https://example.com 或 *)。
Access-Control-Allow-Methods: 指定允许的请求方法(如 GET, POST, PUT, DELETE)。
Access-Control-Allow-Headers: 指定允许的自定义请求头(如 Content-Type, Authorization)。
Access-Control-Allow-Credentials: 是否允许携带 Cookies。
  1. 使用JSONP(仅支持get请求)

通过 <script> 标签加载数据,因为 <script> 不受同源策略限制。服务器返回的是 JavaScript 代码。

  1. 使用WebSocket

WebSocket 不受同源策略限制,可以用于双向跨域通信。需要服务器验证 Origin 确保安全。

相关推荐
Wang's Blog15 分钟前
前端FAQ: Vue 3 与 Vue 2 相⽐有哪些重要的改进?
前端·javascript·vue.js
深圳市恒讯科技17 分钟前
英国服务器Windows系统远程桌面安装与优化
运维·服务器·windows
itachi-uchiha25 分钟前
head和tail命令使用
linux·运维·服务器
violet-lz25 分钟前
Socket编程实战:从基础API到多线程服务器
运维·服务器
初学者_xuan36 分钟前
零基础新手小白快速了解掌握服务集群与自动化运维(十六)集群部署模块——LVS-DR&TUN模式配置
运维·自动化·lvs
toooooop844 分钟前
Nginx 反向代理 HTTPS CDN 配置检查清单(避坑版)
运维·nginx·https·cdn
用户47949283569151 小时前
JavaScript 的 NaN !== NaN 之谜:从 CPU 指令到 IEEE 754 标准的完整解密
前端·javascript
群联云防护小杜1 小时前
国产化环境下 Web 应用如何满足等保 2.0?从 Nginx 配置到 AI 防护实战
运维·前端·nginx
suki_lynn1 小时前
Awaken Chaos Era 云手机推荐
运维·服务器
醉方休1 小时前
Web3.js 全面解析
前端·javascript·electron