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

目录

什么是同源策略

概念:

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

好处:

  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 确保安全。

相关推荐
悄悄敲敲敲1 分钟前
Linux:进程间通信->共享内存
linux·运维·服务器
绵绵细雨中的乡音10 分钟前
Linux进程学习【环境变量】&&进程优先级
linux·运维·学习
夕水16 分钟前
这个提升效率宝藏级工具一定要收藏使用
前端·javascript·trae
天下·第二20 分钟前
【Nginx】负载均衡配置详解
运维·nginx·负载均衡
会飞的鱼先生30 分钟前
vue3 内置组件KeepAlive的使用
前端·javascript·vue.js
GanGuaGua1 小时前
linux:进程的替换
linux·运维·服务器
前端大白话1 小时前
前端崩溃瞬间救星!10 个 JavaScript 实战技巧大揭秘
前端·javascript
梓䈑1 小时前
【Linux系统】详解Linux权限
linux·运维·bash
一千柯橘2 小时前
Nestjs 解决 request entity too large
javascript·后端
见青..2 小时前
【学习笔记】文件包含漏洞--本地远程包含、伪协议、加密编码
前端·笔记·学习·web安全·文件包含