disableremoteplayback仅是前端提示属性,不参与权限控制;真正防投屏需服务端鉴权+时效token url+drm加密,前端video src必须指向受保护接口并校验会员状态。

disableRemotePlayback 属性不能和会员权限联动
HTML 的 disableRemotePlayback 是个纯前端布尔属性,它不接收任何动态值,也不响应 JS 状态变化。你不能写成 disableRemotePlayback="{{ isVip ? 'true' : '' }}" 或用 video.setAttribute('disableRemotePlayback', 'true') 动态开启——浏览器只认“存在即启用”,且只在初始渲染时读取一次。它和用户是否登录、是否付费完全无关,强行绑定只会让人误以为有权限控制效果。
真正起作用的防投屏必须靠服务端鉴权 + DRM 或临时流
投屏的本质是第三方设备向你的视频源发起 HTTP 请求。只要 URL 是公开可访问的(比如 https://cdn.example.com/video.mp4),哪怕加了 disableRemotePlayback,用户也能复制地址用 VLC 投过去。所以:
- 把视频 URL 改成带时效 token 的接口,例如
/api/v1/video/123?token=abc&exp=1729382400,后端每次请求都校验会员状态和过期时间 - 对高价值内容,用 HLS 分片 + 每个
.ts请求都校验 token,避免单个链接被长期复用 - 若需强保护,接入 Widevine(Chrome/Edge)或 FairPlay(Safari),但要求视频提前加密、服务端提供许可证接口、前端用
EME API解密播放——disableRemotePlayback在这里只是锦上添花,不是防线主体
常见错误:用 JS 拦截 play() 或隐藏右键菜单
这些做法毫无意义:
-
video.addEventListener('play', e => { if (!isVip) e.preventDefault(); })—— 用户禁用 JS 就失效,或直接在 Network 面板里抓到真实 src - CSS 隐藏控件 + 自定义按钮再调
play()—— 一样绕不过 Network 面板,且不影响投屏按钮在地址栏的显示 - 检测
navigator.userAgent或屏幕尺寸来“屏蔽电视端” —— 完全不可靠,User-Agent 可伪造,投屏走的是 Cast 协议,不经过页面 JS
最简可行路径:会员标识 → 后端流接口 → 前端 video 标签
不需要复杂 SDK,只要确保三件事:
- 前端
<video></video>的src指向一个受保护的后端接口,如/api/video/456,而不是静态文件路径 - 该接口返回
Content-Type: video/mp4(或其他对应类型),并设置Accept-Ranges: bytes和Content-Range头,否则拖动会失败 - 后端在响应前检查 session 或 JWT,非会员直接返回
403;同时这个接口本身不支持 CORS 外域访问,防止被 iframe 盗用
disableRemotePlayback 可以加上作为辅助提示,但它只是“告诉 Chrome 别显示 Cast 图标”,不是权限开关。真正的权限开关永远在服务端那行 if (!user.isPremium) return forbidden(); 里。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











