当前位置: 首页>后端>正文

websocket服务器端拒绝访问

export const useWebhook = (
  path: string,
  onDisconnect?: () => void,
  override?: WebhookOverride
): WebhookHookOutput => {
  const cache = useGlobalCache()
  const { accessToken, userId } = override ?cache

  const [connectedUserId, setConnectedUserId] = useState<string>()
  const [attempts, setAttempts] = useState<number>(1)
  const [isConnected, setIsConnected] = useState(false)
  const [isLogged, setIsLogged] = useState(false)
  const [socket, setSocket] = useState<Socket>()

  useEffect(() => {
    if (!userId || (connectedUserId && connectedUserId !== userId)) {
      setConnectedUserId(undefined)
      setIsConnected(false)
      setSocket(undefined)
      return
    }
    if (!socket) {
      setSocket(
        accessToken && accessToken.length && tokenStillValid(accessToken)
          io(`${process.env.baseurl}${path}`, {
              path,
              transports: ["websocket"],
              auth: {
                Authorization: `Bearer ${accessToken}`
              },
              extraHeaders: socketConfig.extraHeaders,
              autoConnect: false
            })
          : undefined
      )
      setIsLogged(!!accessToken && !!accessToken.length)
      setConnectedUserId(userId)
    }
  }, [accessToken, connectedUserId, path, socket, userId])

  useEffect(() => {
    if (socket) {
      socket.on("connect", () => {
        setIsConnected(true)
        setAttempts(0)
      })
      socket.on("disconnect", () => {
        onDisconnect?.()
        setIsConnected(false)
        setSocket(undefined)
      })
      socket.connect()
      return () => {
        socket.off("connect")
        socket.off("disconnect")
        socket.disconnect()
      }
    }
  }, [onDisconnect, socket])

  useEffect(() => {
    if (socket && !isConnected && attempts < 10) {
      socket.connect()
      const interval = setTimeout(() => {
        setAttempts(attempts + 1)
      }, 5000)
      return () => clearInterval(interval)
    }
  }, [isConnected, attempts, socket])

  return useMemo(
    // memo necessary to avoid app wide rerenders
    () => ({
      isConnected: isConnected || attempts === 0,
      isLogged,
      socket,
      setSocket,
      userId
    }),
    [isConnected, isLogged, attempts, socket, userId]
  )
}

同一套程序,web端可以正常连接到websocket服务器,而如果是react-native则会报服务器内部错误,刚开始我以为是https证书的问题,本地模拟了一个https服务,结果也能正常访问,最后发现是服务器防火墙拒绝了访问,
Firewall 拒绝没有 User-Agent 字段的访问通常是出于安全和筛选流量的考虑。User-Agent 字符串在 HTTP 请求中扮演重要角色,它提供了关于发起请求的客户端(如浏览器或应用程序)的信息。以下是一些原因,说明为什么缺少 User-Agent 可能导致 Firewall 拒绝访问:

  1. 安全筛选
    识别恶意软件:某些恶意软件和爬虫可能不发送标准的 User-Agent 字符串。Firewalls 和安全系统可能会拒绝没有 User-Agent 的请求,以防止此类恶意活动。
    防止自动化攻击:自动化的网络攻击(如 DDoS 攻击)可能不会包括 User-Agent 字符串。拒绝这些请求可以作为一种防御措施。
  2. 流量管理
    区分人类和非人类流量:没有 User-Agent 的请求可能被视为非人类流量(如脚本或爬虫),而某些服务可能只想为人类用户提供服务。
    分析和日志记录:User-Agent 信息对于理解和分析网站流量至关重要。缺少此信息可能使得流量管理和日志记录变得更加困难。
  3. 兼容性和规范
    遵守协议:虽然 HTTP 规范没有强制要求每个请求都必须包含 User-Agent 字段,但许多网站和应用仍然期望它,并可能基于此设计了安全策略。
    确保内容适配:在某些情况下,服务器可能根据 User-Agent 来决定发送什么样的内容或格式。
  4. 配置和策略
    特定的网络策略:某些网络环境或组织可能有特定的策略,要求所有请求都必须包含 User-Agent 字段,作为访问控制的一部分。

https://www.xamrdz.com/backend/3gn1931757.html

相关文章: