Laravel+SSR实现保存登录状态(步骤详解)
发布时间 - 2023-02-09 00:00:00 点击率:次本篇文章给大家带来了关于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){
s
tate.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视频教程》
# laravel
# 并在
# 创建一个
# 客户端
# 推荐使用
# 这个问题
# 感兴趣
# 我们可以
# 带来了
# 给大家
# 可以使用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
教你用AI润色文章,让你的文字表达更专业
北京企业网站设计制作公司,北京铁路集团官方网站?
JS中对数组元素进行增删改移的方法总结
Python3.6正式版新特性预览
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
长沙企业网站制作哪家好,长沙水业集团官方网站?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
JavaScript如何实现继承_有哪些常用方法
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
简历没回改:利用AI润色让你的文字更专业
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何用免费手机建站系统零基础打造专业网站?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
微信小程序 五星评分(包括半颗星评分)实例代码
Laravel如何使用模型观察者?(Observer代码示例)
如何用wdcp快速搭建高效网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
大连 网站制作,大连天途有线官网?
利用python获取某年中每个月的第一天和最后一天
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
如何用狗爹虚拟主机快速搭建网站?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
个人网站制作流程图片大全,个人网站如何注销?
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
如何在搬瓦工VPS快速搭建网站?
JS碰撞运动实现方法详解
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
如何在IIS中新建站点并解决端口绑定冲突?
如何在阿里云部署织梦网站?
奇安信“盘古石”团队突破 iOS 26.1 提权
Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】


tate.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');
}
},
// ...
}