面试题答案
一键面试用户未登录时重定向到登录页
- 代码实现 - 服务器端重定向:
- 在SvelteKit中,可以在服务器端路由(如
+server.js
文件)中实现。假设使用handle
函数来处理请求:
export const handle = async ({ event, resolve }) => { const session = await event.locals.getSession(); if (!session) { return new Response(null, { status: 302, headers: { Location: '/login' } }); } return resolve(event); };
- 这里通过检查
event.locals
中的会话信息判断用户是否登录。如果未登录,返回一个状态码为302(临时重定向)的响应,并在Location
头中指定登录页的URL。
- 在SvelteKit中,可以在服务器端路由(如
- 代码实现 - 客户端重定向:
- 在组件中,可以使用
$app/navigation
模块的goto
函数。例如:
<script> import { goto } from '$app/navigation'; const session = $state.session; if (!session) { goto('/login'); } </script>
- 这里在组件脚本中,通过检查会话状态,如果未登录,使用
goto
函数导航到登录页。
- 在组件中,可以使用
旧URL重定向到新URL
- 代码实现 - 服务器端重定向:
- 在
+server.js
文件中,可以根据请求的URL进行判断并重定向。例如:
export const GET = async ({ url }) => { if (url.pathname === '/old - url') { return new Response(null, { status: 301, headers: { Location: '/new - url' } }); } return new Response('OK'); };
- 这里如果请求的路径是
/old - url
,返回一个状态码为301(永久重定向)的响应,将用户重定向到/new - url
。
- 在
- 代码实现 - 客户端重定向:
- 在组件中,可以在
onMount
生命周期函数中检查URL并进行重定向。例如:
<script> import { onMount } from'svelte'; import { goto } from '$app/navigation'; onMount(() => { if (window.location.pathname === '/old - url') { goto('/new - url'); } }); </script>
- 组件挂载后,检查当前URL,如果是旧URL,则使用
goto
函数导航到新URL。
- 在组件中,可以在
性能和用户体验差异
- 服务器端重定向:
- 性能:服务器端重定向需要服务器处理请求并生成重定向响应。这会增加服务器的负载,尤其是在高并发场景下。但对于搜索引擎优化(SEO)友好,因为搜索引擎爬虫通常会遵循服务器端重定向。
- 用户体验:用户会立即收到重定向响应,页面会快速跳转到新的URL。但可能会有短暂的加载延迟,因为需要等待服务器响应。
- 客户端重定向:
- 性能:客户端重定向由浏览器执行,不会增加服务器负载。但首次加载页面时,仍然需要加载包含重定向逻辑的页面内容,这可能会导致额外的带宽消耗。
- 用户体验:用户可能会感觉到页面有轻微的卡顿,因为先加载了当前页面,然后再执行重定向逻辑。对于单页应用(SPA),这种卡顿可能相对不明显,但在传统多页应用中会更明显。同时,客户端重定向对于SEO不太友好,因为搜索引擎爬虫可能不会执行JavaScript来完成重定向。