简介
最近使用sveltekit
重构了rhomb
笔记项目,发现在使用sveltekit
构建SPA
(单页应用)时,很难找到一些合适的路由守卫的实现方式。
网上有许多使用cookies
的方式,但是随着cookies
在浏览器中逐步被限制,还是需要知道如何使用JWT
(JSON Web Token
)来实现路由守卫。
实现
在sveltekit
中,+layout.svelte
是一个全局的布局组件,可以在这里实现路由守卫。
<script>
import { goto } from "$app/navigation";
import { page } from "$app/stores";
const UNPROTECTED_PAGES = ["/login", "/signup"];
const SHARE_PATTERN = /^\/share\/.*/;
$: if (
!localStorage.getItem("token") &&
!UNPROTECTED_PAGES.includes($page.url.pathname) &&
!SHARE_PATTERN.test($page.url.pathname)
) {
goto("/login");
}
</script>
因为在使用JWT
时,我们需要将token
保存在localStorage
中,所以我们可以通过localStorage.getItem("token")
来判断用户是否登录。
默认情况下,我们认为JWT
是有效的,只有在localStorage
中没有token
的情况下,我们才会跳转到登录页面。
这样是一种常用的方式,可以避免每次进入页面都需要验证token
的情况。
在这个例子中,我们定义了一个UNPROTECTED_PAGES
数组,用于存放不需要路由守卫的页面,比如登录页面和注册页面。
还有一些特殊的页面,比如/share/
开头的页面,这些页面是可以被分享的,不需要登录就可以访问。