vue实现登录后页面跳转到之前页面
在开发中,我们经常会遇到这样的请求。用户必须直接单击链接才能转到页面。
用户点击链接后,会触发401拦截,返回到链接页面登录界面,而不是首页。
这种问题是:怎么办? 首先我们来说说需要用到的不同API: 1.router.currentRoute:当前路由信息对象。
我们可以通过router.currentRoute.fullPath获取解析后的URL,包括查询参数的完整路径和hash,如果想要访问的页面路径有名称,可以通过router currentRoute.name获取当前的路由名称。
2.router.replace:功能与router.push相同,但不会向历史记录添加新记录,而是替换当前历史记录。
由于每个人的代码写法不一样,我就不包含我的具体实现代码了,但是简单介绍一下思路: 1、用户点击链接后,跳转到目的路由页面,然后激活拦截器401,返回登录。
page://401拦截 if (status=="401"){router.push("/login")} 2.我们可以在401拦截时保存URL中的目标链接: if(status==401) {/ /判断当前路由是否为目标路由 if(router.currentRoute.name=="target " ){//返回登录路由并保存访问查询中的目标路由URL路径 router.replace({name:"login",query:{redirect:router.currentRoute.fullPath}})}else{/* 普通401拦截直接返回登录页面 */router.push('/login' ); }} 3.点击登录后,使用保存的URL查询直接返回登陆页面 router.push({path :decodeURIComponent(url) });
Vue前端实现用户登录功能?
Vue项目中的用户登录、token验证及流程图在前后端完全分离的情况下,Vue项目中实现token验证的大致思路如下:
简单例子:
①登录接口调用成功,回调函数中将token存放到localS中。
在torage和vuex中(在login.vue中)
②store文件夹中的index.js
③Routerguard(router文件夹中的index.js)
④添加code Token对于请求头
⑤如果前端状态码为401时,清除token信息并进入登录页面
流程图:
注册VUE项目并实现录音效果 登录模板
? divclass="login-section"
el-form
?label-position="top"label-width="100px" class="demo-ruleForm"
?:rules="rules"
?:mod el="rulesForm"
?代码 状态
?ref="ruleForm"
?el-form-itemlabel="Username"prop="name "
?el-inputtype="text"v-model="rulesForm.name"/el-input
?/el-form-item
?el-form-itemla bel="password"prop="password"el-inputtype="password"?v-model="rulesForm.password"/el-input
? /el-form-item
?el-form-item
?el-buttontype="primary"@click="submitForm('ruleForm') "提交按钮/el
?重置按钮/el-按钮
?/el-form-item
/ el-form
? div
/template
脚本
import{registration}from'@/service/api';
exportdefault{
?data(){返回{
?RulesForm:{
名称:'',
密码:''
?},
?语法:{
姓名:[
{required:true, message:'请输入您的名字',trigger:"blur"},
?{min:1,max:5,message:"长度3-5",trigger:"模糊"}
],
密码:[
{required:true,message:'请输入密码',trigger:"blur"},
{min: 3,最大值:5,消息:“长度 3-5”,tr igger:"模糊"
?]
?
};
?},
?方法:{?submitForm(formName){
? this.$refs[formName].validate((valid)={
if(valid){
? //如果验证通过,则将用户名和密码发送到后台
?注册({
? 名称:this.rulesForm.name,
密码:this.rulesForm.password,
? }).then((数据)={
console.log(数据)
?if (数据。
code===0){
localStorage.setItem('token',data.data.token);
window.location.href='/';
da ta.code===1){?this.$message.error(data.mes)
?
});
}其他{
console.log("错误提交!!);
returnfalse;
}
?});
?}
/script
stylelang="stylus".注册部分 登录
?padding0px20px
/style
吃模板
?divclass="login-section"
el-form
?label-position="top"
?label-width="100px"class="demo-ruleForm"
?:rules="rules"
?:model="rulesForm"
状态代码
?ref="rul eForm"
?el-form-itemlabel="username"prop="name "
?el-inputtype="text"v-model="rulesForm.name “/el-input
?/el-form-item
?el-form-itemlabel="password"prop="password"
el-inputtype="password"v-model="rulesForm.password"/el-input
?/el-form-item
?el-form-item
?el-buttontype="primary"@click="submitForm('ruleForm')"提交/el-button
?el-buttonReset/el-button
?/el -form -element
? ?/el-form
?/div
/template
脚本
从'@/service/api导入{login} ';
默认导出{
?data(){
return{
?//要存储的对象数据
?rulesForm: {
名称:'',
密码: ''
?},
?语法:{
?名称:[
? {required:true,message:'请输入您的姓名',trigger:"blur"},
? {最小值:1,最大值:5,消息:“长度3-5”,触发:“模糊”
],
密码:[
{required:true,mes sage:'请输入密码',trigger:"blur"},
?{ 分钟: 3,max:5,message:"长度3-5,trigger:"模糊" }
?]
?
};
?},
?方法:{
?submitForm(formName){
? this.$refs[formName].validate((valid)={
if(valid){
? //如果校准通过,则将用户名和密码发送到后端
Log in({
name:this.规则表单.name,
密码:this.rulesForm.password,
?}).then((data)={
console.log(data)
if(data.code==0){
? localStorage.setItem('token',data.data.token);
?window.location.href ='/';
p
?
if(data.code====1){
? 这个.$message.error(data.mes)
? });
}其他{
console.log("错误提交!!);
returnfalse;
?
?});
?}
/script
StyleLange =“笔”
。
登录部分
?padding0px20px
/style
importVuefrom'vue'
importRouterfrom'vue-router'
Vue.use(路由器)
importStorefrom'@/stor e'
从'@/service/api.js'导入{userInfo}
importLoginfrom'@/views/user-login/index.vue'
constrouter=newRouter({
模式:"历史",
路线:[
{
< 路径:'/登录',名称:"登录",
?地址:"登录页面"
组件:登录,
定义:{
? 输入:True
]
});
//路由器守卫
router.beforeEach(async(to,from,next)={
/*
? ?有些方法需要登录才能确定登录状态。
状态
1.未登录:进入登录页面
登录,直接输入注意:是否需要登录--Meta
*/
consttoken=localStorage.getItem('toke n');
constisLogin=!!token;
//输入路径时,需要发送将token传给后端检查是否合法
constdata=awaituserInfo();
Store.commit('chageUserInfo',data.data)
?if(to.matched.some(item=item.meta.login)){// 需要登录
?console.log("需要登录");
?if(to.matched.some(item=item.meta.login)) pif(isLogin){//您已经登录,直接从
if(data.error====400) {//返回通知您,注册失败 登录
next({name:'login'});
? ;
return;
if( to.name== = '登录'){
next({name:'home'});
}其他{
next();
返回;
? ?}
?if(!isLoginto.name==='l ogin'){//您尚未登录,但会进入登录页面
next();
if(!isLoginto.name!=='login'){//未注册登录,不是注册页面 登录
next({name: “登录” });
?
?}else {
?next();
?}
})
exportdefaultrouter;
11|实现登录前端
界面要点 前端,编写登录请求函数,与用户注册类似,前端获取用户名和密码发起POST请求。
如何不断存储收到的token以及如何在每次请求时携带token是这里的关键点。
有关用户登录界面的详细信息,请点击此处。
这里还有点可以改进,这个时候你可能需要添加验证码等额外的信息,这样对你来说会比较不方便,可以将参数数据格式包裹进去。
一个物体。
当然这里还是采用第一种方法。
这不是重点,这是我们登录成功后要做的事情。
在接口协议下,我们登录成功后可以得到如下信息:
这里我们需要用到token字段,我们现在有token,但是当我们登录的时候它就会消失更新一下吧,所以要做一些持久化存储,你想存到哪里都可以,只要你能找到。
这里存储在localStorage中,在Chrome86中,也可以保存到本地文本文件中,但读取速度较慢。
除了token之外,我们还需要保存用户信息,比如显示主页的用户头像等信息。
考虑到本地信息的安全性,本地保存的用户信息不作为数据请求的凭据,仅用于显示目的。
当用户修改本地用户信息时,不会影响登录状态,因为后端是根据token判断token有效,登录成功,而不是本地服务器认为是你在存储用户信息,而前端是不值得信赖。
这种登录方式的风险是用户代码会被盗,但这很难避免,而最安全的还是人。
。
。
成功登录并返回主页后,用户名或用户头像不会同时更新,因为这是一个单页应用。
你可以将登录的用户信息保存在localStorage中,当你到达首页时,页面没有刷新,DOM中localStorage中的信息也没有及时更新,用户信息仍然是你没有的用户信息登录页面输入的自然是无法显示的。
很简单,更新一下。
页面刷新时,会从localStorage中读取用户信息,并显示当前登录的用户。
。
。
我不想更新。
也很简单,设为响应式数据即可。
来吧,来吧,狐狸。
当token存储在cookie中时,前端不需要主动设置,默认是转传给服务器的,这里我们保存在授权中,所以我们需要要准备它,拦截请求,并在请求中添加一个标记,然后发送。
好吧,让我们回顾一下整个过程。
当用户访问/login时,会被前端指令处理并指向Login.vue。
用户看到登录框,填写自己的账号 当用户填写账号时,会实时监控姓名密码,并显示登录按钮,影响可操作性。
仅当用户输入完整帐户密码后,登录按钮才可用。
前端收集用户信息,调用网络中封装的longin请求函数,在发送前拦截请求,并添加token,使用账号密码登录时可能为空。
令牌没有实际作用。
后端检查成功并响应。
前端通过对响应中的数据令牌进行更改来更新 Vuex 中的状态,关闭页面并导致令牌丢失。
如果登录成功,您将进入应用程序的主页。
获取用户头像通过 Vuex 等信息 由于 Vuex 中的数据是响应式的,当你从登录到首页页面时,用户头像等信息也会按照更新获取。
当用户添加新文章时,只需要将文章数据传输到服务器,通过后端从请求头中的token中获取文章作者的相关信息。
这里需要注意的是,前端并没有将本地用户信息作为准确的作者信息。
为了减少对虚假信息的信任,用户完全可以将本地用户名从张三更改为李四,并且需要通过用户提供的令牌来识别最终作者。
虽然令牌也可能被伪造,但相对困难,而且往往更容易被盗。
无密码登录实际上仍然需要“密码”,但它被替换为临时的、不可读的字符串,每次您要求密码时都会为您填写。
在不考虑安全性的情况下,它基本上是将您的密码存储在浏览器中,然后在您每次访问网站时要求浏览器帮助您输入用户名和密码。
这个过程不适合你。
这样你就不用每次更新的时候都像白痴一样填写表格了。
填写表格非常无聊。
是时候学习 TypeScript 了。
在后台管理系统工作时,经常需要点击记住密码,然后登录系统,进行一些操作后又退出系统。
并且希望能够自动记住上次登录的账户密码也没有实现。
情况很复杂。
记住密码选项的值动态链接到一个具体的值,选择时这个值默认为false,设置一个真实的值,然后通过这个值发送账号和密码时你此时注册,存储了一个密码,并根据指定的逻辑值在本地存储中计算。
如果为 true,则存储账户密码;如果为 false,则存储一个空对象。
当用户完成该过程注销后,会返回到登录页面,此时登录组件的生命周期会执行一次,可以将本地存储的值重置为。
生命周期中再次形成登录页面,从而实现注册时记住密码的功能。
3.1.1。
登录表单
3.1.2. 来自父组件的数据
登录表单:表单的帐户和密码数据,已验证:您是否选择记住密码?
3. 1.3. 验证登录表单
3.1.4. 登录表单的深度监控
主要监控登录页面的返回,看表单页面的数据是否填满,如果有数据,则启动监听器,执行init()方法进行初始化。
形式。
3.1.5.init
重置选项的逻辑值
3.2.1。
子组件简介
2. 判断本地缓存是否有数据。
如果是,则在整个生命周期内为模型元素赋值
3.2.4。
提交按钮的逻辑操作
这部分需要判断是否选择记住密码,清空对象不仅会清除之前保存的帐户和密码,而且还保证了当前的帐户密码不会被选中。
下次登录时的任何数据。
3.2.5。
保存用户设置的方法
该方法的目的是保存用户是否选择了记住密码的选项
最终的通用功能当然是,出于安全考虑,最好还是在存储到本地之前对md5进行加密(也可以接受其他加密,例如AES加密),然后在生命周期中对表单元素进行解密并为其赋值,从而提高了生命周期。
articleclass="_2rhmJa"
调用登录接口(先说明一下需要做什么)
在前端和后端完全分离的情况下,Vue项目中实现token验证的大致思路如下:
1登录接口到后端并发送用户名称和密码。
2. 后端接收请求,验证用户名和密码,如果验证成功,则返回token给前端。
3. 前端获取token并将token存储到localStorage和vuex中,并进入路由页面
4。
前端每次跳转到路由页面时都会判断localStroage中是否有token,如果没有则跳转到登录页面。
进入相应的引导页面
5. 每次你这样做的时候通过设置后端,必须在请求头中添加token
6 请求头,如果有token,则获取token并验证token,如果验证成功,则返回数据验证失败(示例:Token已过期),返回401,如果请求头中没有Token,则返回401。
7. 如果前端获取到状态码为401,则清除token信息并进入登录页面
调用登录接口成功,回调函数中token会存储在localStorage和vuex中
1.template
div
/div
/template
exportdefault{
data(){
},
方法:{
///判断是否输入过账号密码,如果没有则,将发送一条警报,显示
}
};
将令牌添加到存储文件夹中的 Index.js 文件
importVuefrom ' vue';
导入 tVuexfrom'vuex';
Vue.use(Vuex);
conststore=newVuex.Store({
状态:{
},
突变:{
}
});
exportdefaultstore ;
其次,配置 Mobility警卫 对于router文件夹下的路径
index.js
importVuefrom'vue';
importRouterfrom'vue-router';
importloginfrom'@/components/login';
<importhomefrom'@/components/home';
Vue.use(Router);
constrouter=newRouter({
路由:[
>]
});
//导航守卫
//使用router.be
vue填写个人信息(vueuseragent)
vue修复登录刷新后登录信息丢失的问题问题:在最近搭建的后端输入信息后,登录页面会是右上角显示的个人信息名称。
使用$router.push的参数登录,跳转信息后进入页面,但重启后$route.params值为null
解决方案:将登录信息存储到localStorage中。
created(){
?if(localStorage.getItem('login')=='null'){
?this.infoForm=this. $route.params
?localStorage.setItem('login',JSON.stringify(this.$route.params))
}el se{
?this.infoForm=JSON.parse(localStorage.getItem('login'))
}
?},
如何通过vue网站参加cisco考试
网页版考试报名流程
2. 单击“编号候选人登录”
3. 点击页面索引:AtoZlistofallprograms; 选择cisco系统; 然后点击后面的createaccount, 填写个人信息注册VUE考试账号。
4注册后, 您可以根据自己的时间直接预约,但有的需要一个工作日才能收到系统发送的考试账号和初始密码。
5. 如果您还没有参加或已经参加过考试。
如果您有帐户; 可以直接访问网站预约考试。
总体思路是前端和后端完全分离。
在 Vue 项目中token验证的实现如下:
首次登录时; 前端调用后端的登录接口,发送用户名和密码
2 后端接收请求,验证用户名和密码,如果验证成功。
向前端发送回一个token
3 token存储在localStorage和vuex中并跳转到路由页面
4 前端每次跳转到路由页面时; localStroage会判断是否有token。
会跳转到登录页面; 如果有则跳转到相关路由页面
5 每当调整后端界面时; 请求头中必须添加token
6. 防御者判断请求头中是否包含token。
如果验证成功, 如果认证失败(例如token已过期),如果请求头中没有token,则返回401。
将返回 401。
p > 7, 如果前端收到状态码401 会清除token信息并跳转到登录。
页
用vue-cli搭建一个项目,简单说明一下前端要做的事情:
1. 登录界面配置成功,token存储在localStorage和vuex中。
回调函数中
login.vue
form
div
input?type="text" ?v- model="loginForm.username"?placeholder="用户名"/
input?type="text"?v-model="loginForm.password"?placehold="password"/
?button?@click="login" 登录/按钮
/div
/template
脚本
导入?{?mapMutations?}?from?'vuex';
导出?默认?{
什么? {
?返回?{
loginForm-?{
用户名-? ',
密码:?''
},
方法:?{
? mapMut ations(['changeLogin']),
?login?()?{
let?_this?=?this;
if?( this.loginForm.username?===?''?||?this.loginForm.password?===?'')?{
是吗? rt('账号或密码不能为空');
}?else?{
this.axios({
?method:?'post',
?url:?'/user/login',
?数据:?_this.loginForm
?}).then(res?=?{
?console.log(res.data);
?_this.userToken?=?'承载?'?+?res.data.data.body.token;
//?将用户令牌存储在vuex中
?_this.changeLogin({?authorization:?_this.userToken?});
?_this.$router.push( ' /home');
alert('登录成功');
?}).catch(错误. =?{
?warning('账号或密码错误');
?console.log(error) ;
<?});
? ?
}
/script
store 文件夹中的index.js
imp ortVuefrom'vue';
importVuexfrom 'vuex';
Vue.use(Vuex);
conststore=newVuex.Store({
?state-{
//存储 令牌
Authorization:localStorage.getItem('Authorization')?localStorage.getItem('Authorization'):''
?},
? mutations-{
//修改token,将token存储到localStorage
changeLogin(state,user){
?state.授权=用户.授权;
?localStorage.setItem('授权',user.Authorization);
}
?}
});
exportdefaultstore;
2. 路由导航守卫
router文件夹中的index.js
importVuefrom'vue';
importRouterfrom'vue -r Outside';
importloginfrom'@/components/login';
importhomefrom'@/components/home';
Vue.use( Router);
constrouter=newRouter({
?paths-[
{
?path:'/ ',
?重定向:'/login'
},
{
?路径:'/登录',
?名称:'登录',
?组件:登录
},
{
?路径:'/home',
?名称:'home',
?component:home
}
?]
});
//导航卫士
//使用Router.beforeEach注册全局抢占,判断用户是否登录
router.beforeEach((to,from,next)={
?if(to.path==='/login'){
next();
?}else{
lettoken=localStorage.getItem('授权');
if(token==='null'|| token==='){
?next('/login');
}其他{
?next() ;
}
?}
});
exportdefaultrouter;
3. 要求添加Header Token
//添加请求拦截器,并在请求头中添加token
axios.interceptors.request.use(
?config={
if (localStorage.getItem('权限'))){
?config.headers.Authorization=localStorage.getItem('Authorization');
}
returnconfig;
?},
?error={
returnPromise.reject(error);
?});
4. 如果前端收到401状态码。
清除token信息并进入登录页面
localStorage.removeItem('Authorization');
this.$router.push('/login' );