本篇文章給大家帶來了關於Laravel+SSR的相關知識,其中主要介紹了有關Laravel SSR 下是如何儲存登入狀態的,感興趣的朋友,下面一起來看一下,希望對大家有幫助。
基於 Laravel + Nuxt3 的線上 Demo(https://laravel-nuxt3.ruti.page/)
Laravel + SSR nuxt: 如何儲存登入狀態?
Laravel + 使用者端渲染的 Vue 確實寫起來比較快,但是我們有些時候確實很需要 SEO,比如說電商、入口網站、論壇;而且對於大型專案,相比起使用者端渲染,伺服器端渲染帶來的首屏載入時間上的優勢確實是碾壓的。
但是很多同學卡在了 SSR 下如何儲存登入狀態 這個問題下面,即如何像傳統的 PHP/JSP 頁面那樣,重新整理頁面後仍保有登入狀態
準備工作
首先準備 2 個介面,一個是
GET http://example.com/api/auth/user
登入後複製
使用者獲取當前登入使用者資訊
POST http://example.com/api/auth/tokens
登入後複製
用於請求授權
這裡有一個包含 GitHub OAuth 的完整例子 ? laravel-nuxt3-api,並且測試覆蓋率是 100%
開始 SSR
Nuxt3
在 Nuxt3 中,可以很自由地建立一個 server only 的指令碼,在 initial 整個 Nuxt App 時,可以在渲染 html 前執行這個 server only 的指令碼,並在渲染 html 時使用其返回的結果。
我們可以在 plugins 下面建立一個 *.server.[js|ts] 的 server only 的指令碼,
plugins/init.server.js
import { defineNuxtPlugin } from '#app';
import { useAuth } from '~/store/auth.js';
function cookieFromRequestHeaders (key) {
const headers = useRequestHeaders(['cookie']);
if ('cookie' in headers) {
const cookie = headers.cookie.split(';').find(
c => c.trim().startsWith(`${key}=`)
);
if (cookie) {
return cookie.split('=')[1];
}
}
return '';
}
export default defineNuxtPlugin(async (nuxtApp) => {
const token = cookieFromRequestHeaders('token');
if (token) {
const auth = useAuth(nuxtApp.$pinia);
auth.setToken(token);
await auth.fetchUser();
}
});
登入後複製
在 store/auth.js 定義管理全域性狀態的 pinia,並在其中傳送非同步請求
import { defineStore } from 'pinia';
import { useCustomFetch } from '~/composables/useCustomFetch.js';
import cookie from 'js-cookie';
export const useAuth = defineStore('auth', {
state: () => ({
_token: '',
_user: {},
}),
getters: {
token() {
return this._token;
},
user() {
return this._user;
},
},
actions: {
async fetchUser() {
const { data, error } = await useCustomFetch('/auth/user');
if (error.value) {
this.reset();
}
else {
this.setUser(data.value);
}
},
// ...
},
});
登入後複製
注意: Nuxt3 中不推薦使用 axios 等第三方的 http 包,而是使用其內建的 useFetch()
完整的例子 ? laravel-nuxt3-web
Nuxt2
在 Nuxt2 中,不同於 Nuxt3,Nuxt2 只能在 store/index.js 中的 nuxtServerInit() 中執行 server only 的指令碼(但是這裡我們可以使用 axios)
store/index.js
export const actions = {
nuxtServerInit({ commit, dispatch, route }, { req }){
const token = cookieFromRequest(req, 'token');
if (!!token) {
commit('auth/setToken', token);
}
}
};
登入後複製
store/auth.js
import Cookie from 'js-cookie';
export const state = () => ({
user: null,
token: null
});
export const getters = {
user: state => state.user,
token: state => state.token,
check: state => state.user !== null
};
export const mutations = {
setToken(state, token){
state.token = token;
},
fetchUserSuccess(state, user){
state.user = user;
},
fetchUserFailure(state){
state.user = null;
},
logout(state){
state.token = null;
state.user = null;
},
updateUser(state, { user }){
state.user = user;
}
}
export const actions = {
saveToken({ commit }, { token, remember }){
commit('setToken', token);
Cookie.set('token', token);
},
async fetchUser({ commit }){
try{
const { data } = await this.$axios.get('/auth/user');
commit('fetchUserSuccess', data);
}catch(e){
Cookie.remove('token');
commit('fetchUserFailure');
}
},
// ...
}
登入後複製
更完整的程式碼 ? Nuxt middleware to check if user is logged in not working
推薦學習:《》
以上就是Laravel+SSR實現儲存登入狀態(步驟詳解)的詳細內容,更多請關注TW511.COM其它相關文章!