You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SvelteKit实现断网提示界面及登录状态持续检测方案咨询

1. 实现类似YouTube的无网络连接提示界面

可以通过浏览器原生API结合SvelteKit的全局组件实现,同时可额外增加服务器连接检测提升准确性:

  • 基础离线状态监听
    创建全局组件OfflineNotice.svelte,监听浏览器online/offline事件切换提示显示:

    <script>
      import { onMount } from 'svelte';
      let isOffline = !navigator.onLine;
    
      const handleStatusChange = () => {
        isOffline = !navigator.onLine;
      };
    
      onMount(() => {
        window.addEventListener('online', handleStatusChange);
        window.addEventListener('offline', handleStatusChange);
        return () => {
          window.removeEventListener('online', handleStatusChange);
          window.removeEventListener('offline', handleStatusChange);
        };
      });
    </script>
    
    {#if isOffline}
      <div class="offline-banner">
        当前无网络连接,请检查网络设置
      </div>
    {/if}
    
    <style>
      .offline-banner {
        position: fixed;
        top: 0;
        width: 100%;
        background: #ff4444;
        color: #fff;
        padding: 1rem;
        text-align: center;
        z-index: 9999;
      }
    </style>
    

    在根布局+layout.svelte中引入该组件,确保全局生效:

    <script>
      import OfflineNotice from '$lib/components/OfflineNotice.svelte';
    </script>
    
    <OfflineNotice />
    <slot />
    
  • 补充服务器连接检测
    浏览器navigator.onLine可能存在误判,可新增轮询服务器接口的逻辑:
    在OfflineNotice.svelte中添加:

    let serverReachable = true;
    
    const checkServerConnection = async () => {
      try {
        const res = await fetch('/api/ping', { method: 'HEAD' });
        serverReachable = res.ok;
      } catch {
        serverReachable = false;
      }
      isOffline = !navigator.onLine || !serverReachable;
    };
    
    onMount(() => {
      checkServerConnection();
      const interval = setInterval(checkServerConnection, 5000);
      return () => clearInterval(interval);
    });
    

    对应创建/api/ping/+server.js接口:

    export function HEAD() {
      return new Response(null, { status: 200 });
    }
    
2. 持续检测用户登录状态

方案一:定时API轮询

在根布局或全局组件中定时调用登录状态验证接口,未登录时自动跳转:

<script>
  import { onMount } from 'svelte';
  import { goto } from '$app/navigation';
  import { page } from '$app/stores';

  const checkAuthStatus = async () => {
    try {
      const res = await fetch('/api/auth/check');
      if (!res.ok && $page.url.pathname !== '/login') {
        await goto('/login');
      }
    } catch {
      // 网络异常时可暂不处理,或根据需求调整
    }
  };

  onMount(() => {
    checkAuthStatus();
    const interval = setInterval(checkAuthStatus, 30000); // 每30秒检查一次
    return () => clearInterval(interval);
  });
</script>

方案二:WebSocket实时推送

通过WebSocket让服务器主动通知前端会话过期,比轮询更高效:
在根布局中添加WebSocket逻辑:

<script>
  import { onMount } from 'svelte';
  import { goto } from '$app/navigation';
  import { page } from '$app/stores';

  let socket;

  const initWebSocket = () => {
    socket = new WebSocket(`ws://${window.location.host}/ws/auth`);
    
    socket.onmessage = (event) => {
      const data = JSON.parse(event.data);
      if (data.type === 'SESSION_EXPIRED' && $page.url.pathname !== '/login') {
        goto('/login');
        socket.close();
      }
    };

    socket.onclose = () => setTimeout(initWebSocket, 5000); // 断开后自动重连
  };

  onMount(() => {
    initWebSocket();
    return () => socket?.close();
  });
</script>

服务器端需实现WebSocket服务,在用户会话过期时向前端发送SESSION_EXPIRED类型消息,同时在用户主动退出时关闭连接。

内容的提问来源于stack exchange,提问作者Basil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:10:20