scala - Play Framework - 在 Web 套接字响应头中编辑 Sec-WebSocket-Protocol
问题描述
编辑从服务器发送到客户端的 Web 套接字头响应。
我正在使用 playframework 创建一个 websocket 服务器应用程序。现在来自服务器的 websocket 响应由 Play 处理。以下是响应标头,
Request Header:
(UpgradeToWebSocket,),
(Host,localhost:8083),
(Connection,Upgrade),
(Upgrade,websocket),
(Sec-WebSocket-Version,13),
(Accept-Encoding,gzip, deflate, br),
(Accept-Language,en-US,en;q=0.9),
(Sec-WebSocket-Key,ZvfzpVo3EX4DFA4BRcgRIA==)
def chatSystem(): WebSocket = WebSocket.acceptOrResult[String, String] { request =>
Future.successful{
AuthenticationService.doBasicAuthentication(request.headers) match {
case Results.Ok => Right(ActorFlow.actorRef { out => ChatServiceActor.props(out) })
case _ => Left(Unauthorized)
}
}
}
我想验证Sec-WebSocket-Protocol是否存在于请求标头中,或者如果它不存在,则在服务器响应中添加相同的值。
解决方案
我使用了以下代码:
// Defined at http://tools.ietf.org/html/rfc6455#section-4.2.2
val MagicGuid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
def websocketAcceptForKey(key: String): String = {
val sha1 = MessageDigest.getInstance("sha1")
val salted = key + MagicGuid
val hash = sha1.digest(salted.asciiBytes)
val acceptKey: String = Base64.rfc2045().encodeToString(hash, false)
acceptKey
}
像下面这样使用它:
val wsKey: Optional[HttpHeader] = request.getHeader("Sec-WebSocket-Key")
val wsAccept = if (wsKey.isPresent) Some(RawHeader("Sec-WebSocket-Accept", websocketAcceptForKey(wsKey.get.value()))) else None
推荐阅读
- java - 扩展 Javac 解析器行为
- python - 对两个 RGB 像素值求平方时的值错误(OpenCV + Python)
- csv - 无法通过命令行创建仪表板报告
- python - 在 Python 中加载默认的 os.environ sys.path 已更改一次。视窗
- flutter - 尝试在 https://pub.dartlang.org 查找包时出现套接字错误
- sql-server - 从一个 SELECT DISTINCT 数据列应用标准,以匹配示例的第二个数据列
- bar-chart - 在 Power BI 中按类别以百分比形式显示值
- java - 为什么滚动时标签会移动?框架
- c# - 为什么我的事件处理程序会停止事件引发程序的执行?
- java - java根据输入灵活数组大小