以前一直用 vue3
,现在在学习用 nuxt3
,遇到一个传 token
的问题,研究半天没明白,nuxt3
这个 token
要怎么请求的时候传过去?
我先讲下我的 vue3
是怎么用的
用户第一次访问网站,检查 localStorage.getItem('token')
是否为空,如果为空或token
过时,直接跳到登录页面,登录后获取 token
存放到 localStorage.setItem('token', token)
里面,之后每次页面的所有请求都在 headers.Authorization
里面带上,如下:
import axios from 'axios';axios.post('/api/users', { headers: { Authorization: 'Bearer ' + localStorage.getItem('token') } }).then(response => { console.log(response.data); }) .catch(error => { console.error(error); });
那 nuxt3
获取的 token
放在哪,怎么在下面请求中带上?
const { data } = await useFetch('/api/users');
xxx.vue
文件中,更本就不能使用 localStorage
,该怎么做?
网上都说用用 useState
,
// states.tsexport const useToken = () => useState<string>('token', () => '');
登录后获取 token
,存到 useToken().value = token
里面,那我刷新页面不就没了
这里主要涉及一个思路的转换。
在 Vue,或者说传统 SPA 里,所有请求都是 后 请求,即完成网页加载、JS 执行完毕后,再发起请求。这些请求,可以认为完全由开发者控制,即你知道什么时候该请求,然后发起请求。一般来说,所有的请求都是 数据交互类。
在 Nuxt 里,因为 SSR 的存在,所以请求至少可以分成两类:页面渲染类,数据交互类。前者会影响到 HTML 的内容。在网络环境里,存在大量缓存节点,假如跟用户相关的敏感数据渲染成 HTML,缓存到 CDN 当中,会是非常大的安全问题。所以 Nuxt 在 SSR 及其内部发起请求时,不会携带 cookie;在用户主动发起的请求里,才会携带 cookie。
回到你的问题。
localStorage
存在用户本地,无法在网络请求中携带,所以必须在网页准备就绪后才能使用localStorage
的请求就不能放在 useAsyncData
、useFetch
里,因为它们都是 SSR 的关键函数,它们第一次起作用的时候,运行环境是线上的 node.jsonMounted()
里使用 $fetch
请求,用传统 SPA 的形式就可以了。在 Nuxt3 中,可以使用 ibm/q哲提出的qiniu-js
存储库中的 cookies
API 来存储和获取 token。具体操作如下:
首先,需要安装 qiniu-js
存储库,可以使用 npm 或 yarn 进行安装:
npm install qiniu-js
或
yarn add qiniu-js
然后,在需要使用 token 的地方,使用 cookies
API 获取和存储 token。示例代码如下:
import { Cookies } from 'qiniu-js';// 在登录成功后获取 token,并使用 Cookies 存储async function login() { const response = await fetch('/api/login'); const token = await response.json(); Cookies.set('token', token);}// 在需要使用 token 的请求中获取async function fetchData() { const token = Cookies.get('token'); const response = await fetch('/api/users', { headers: { Authorization: 'Bearer ' + token, }, }); const data = await response.json(); console.log(data);}
这样,在登录成功后,token 会被存储在用户的浏览器中,后续请求时会自动带上。同时,由于使用了 Cookies
存储 token,因此即使刷新页面,token 也不会丢失。
问题内容: 有谁知道如何使“ Google ReCAPTCHA(v2)”成为“必填项” ? 我的意思是直到填写Recaptcha才提交表单? 我在表单中使用ParsleyJs,但没有找到使其与s 一起使用的方法。 问题答案: 您必须使用reCaptcha验证响应回调。像这样:
Symfony中的默认CSRF预防是基于表单的(如果使用提供的表单生成器,则会自动发生)。然而,对于AJAX请求,手动将CSRF令牌附加到每个HTTP请求,然后手动检查每个请求,这是非常繁琐的。 一个好的方法是将令牌嵌入为HTTP标头,如本问题的注释中建议的那样。jQuery然后可以被配置为在每个请求中包含这个标头,如这里所述。 我的问题是如何在Symfony内最好地处理这个问题?我可以使用Twi
vue3项目中个别请求需要使用到另外一个token怎么处理呢 vue3项目中个别请求需要使用到另外一个token怎么处理呢
本文向大家介绍axios同时请求多个接口,如果当token过期时,怎么取消后面的请求?相关面试题,主要包含被问及axios同时请求多个接口,如果当token过期时,怎么取消后面的请求?时的应答技巧和注意事项,需要的朋友参考一下 axios的话可以使用cancelToken来实现。如果是原生的XMLhttprequest的话,需要使用abort()方法实现。 https://juejin.im/po
本文向大家介绍请求时token过期自动刷新token操作,包括了请求时token过期自动刷新token操作的使用技巧和注意事项,需要的朋友参考一下 1.在开发过程中,我们都会接触到token,token的作用是什么呢?主要的作用就是为了安全,用户登陆时,服务器会随机生成一个有时效性的token,用户的每一次请求都需要携带上token,证明其请求的合法性,服务器会验证token,只有通过验证才会返回
nuxt3项目,打开网页后,通过F12查看网络,发现打开每一页,在网络的"其它"请求项中,都有大量重复的请求 比如打开A页面,有a、b、c的图片,d、e、f的js文件,打开B页面,也是有a、b、c的图片,d、e、f的js文件,C页面也是如此,但是A、B、C页面并没有使用到这些资源,求解