Vue+Vuex实现自动登录的知识点详解


Posted in Javascript onMarch 04, 2020

在之前实现的版本中,如果你进行测试,可以看到在浏览器的local Storage中,确实里面有了我们加入的Authorization,而且如果没有登录的话,直接访问主页会进入登录页面。但其实有好几个问题并没有解决:

一、我们所加的Authorzation其实并不是从服务器传过来的,而是自己的测试:只要服务器传过来了200的响应状态码,我们就自己加上固定的Authorization

二、我们重新进入的时候,判断条件是只要有Authorization就可以直接进入了,但其实应该提交给服务器判断这个Authorization是否在数据库中,才可以。

基于以上两点,我们对代码进行修改:

首先就是,我们获取的token应该是从服务器获取的,而不是自己给定,因此直接在服务器上接收到信息后修改:

@RequestMapping(value = "/login",method = RequestMethod.POST)
  public RespBean login(
      @RequestBody UserLogin userLogin,
      Model model
  ){
    if (userService.check(userLogin)){
      String token = UUID.randomUUID().toString();
//      System.out.println(token);
      userService.autoLog(userLogin,token);
      return new RespBean("success","登录成功",token);

    }else{
      return new RespBean("fail","登录失败");
    }
  }

这里使用uuid直接生成随机的token,为了用respBean传递回去数据,因此传递回去的对象除了状态信息和消息之外,还需要多加一个token:

RespBean对象代码为:

public class RespBean {
  private String status;
  private String msg;
  private String token = null;
}

各种方法自己加上就好了。

如果仔细的话,会发现我们传进来的参数好像跟上一次的不一样了,上一次传递了两个用@RequestParam修饰的账号密码的String类型的对象,而这一次直接传递了一个UserLogin的对象,这是因为我觉得如果要接收表单等信息的话,每一个都使用这样的一个个参数会显得接收参数很多,而且如果要修改接收的数值的话,可能需要很多地方都要修改,复用性太差了。

第二个原因是我们的Controller层应该只是最大限度的逻辑表示,而具体怎么添加用户、怎么鉴别用户是否登录等信息,完完全全应该交给下层的Service层呀Mapper层呀去做,但如果接收的是这样的password、username等数值的话,调用下一层的时候,我们还需要把这些数值直接放入,否则就要在Controller层对数据进行操作,这就破坏层次结构了。

所以,为了解决这个问题,我们可以把所有表单中需要用到的数据单独封装成一个对象,这个对象就专门用来接收web的数据以及在各个层之间流转:

java @Data public class UserLogin { private String username; private String password; }把,
这里的@Data注解就是lombok的注解,可以让我们不用再去创建get、set等方法了。这样创建完对象以后,我们的登录操作就可以直接将这样的对象拿来使用了。

但是,如果你是跟着做下来的,就会遇到跟我一样的问题:登录的时候会报错:

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unrecognized token 'username': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'username': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')

大概的意思就是说,我们接受的跟发出的不大一样,对应不上,而这样的原因是:我们当时为了使用get和@RequestParam方法,在api.js中,把获取到的json数据格式,变成了json字符串的格式了,所以就不能使用@RequestBody这样一个接收json对象的方法来接收了。

因此上一个程序中的api.js改为:

export const postRequest = (url, params) => {
 return axios({
  method: 'post',
  url: `${base}${url}`,
  data: params,

  // transformRequest: [function (data) {
  //  // Do whatever you want to transform the data
  //  let ret = ''
  //  for (let it in data) {
  //   ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
  //  }
  //  return ret
  // }],
  headers: {
   'Content-Type': 'application/json;charset=UTF-8'
  }
 });
}

详细的可以看一下这个文章@RequestBody和@RequestParam的区别

而第二点,关于如何实现鉴别token,就是在路由之前的那个方法上,加上传递给服务器以及接收相应信息进行操作:

router.beforeEach((to,from,next)=>{
 if(to.path ==='/login'){
  next();
 }else {
  let token = localStorage.getItem('Authorization');

  if(token ===null || token ===''){
   next('/login');
  }else {
   getRequest('/autoLog',{
     token:token
   }).then(resp=>{
    if(resp.status == 200){
      var json = resp.data;
      if(json.status=='success'){
       next();
      }else{
       // next('/login');
      }
    }else{
     alert('请求失败', '失败!');
    }
   })
  }
 }
});

服务器的处理也就很简单了,跟上面登录其实是差不多的,就不再列举出来了

以上就是Vue+Vuex实现自动登录的知识点详解的详细内容,更多关于Vue+Vuex实现自动登录的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jquery实现漂浮在网页右侧的qq在线客服插件示例
May 13 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
Aug 21 Javascript
node.js中的fs.utimes方法使用说明
Dec 15 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
Jun 04 Javascript
js删除数组元素、清空数组的简单方法(必看)
Jul 27 Javascript
JS简单生成两个数字之间随机数的方法
Aug 03 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
Oct 24 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
Jan 04 Javascript
详解VUE2.X过滤器的使用方法
Jan 11 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
Apr 23 Javascript
vue-cli 打包后提交到线上出现 "Uncaught SyntaxError:Unexpected token" 报错
Nov 06 Javascript
vue2.0 解决抽取公用js的问题
Jul 31 Javascript
vuex入门最详细整理
Mar 04 #Javascript
JavaScript 严格模式(use strict)用法实例分析
Mar 04 #Javascript
vue 自定义组件的写法与用法详解
Mar 04 #Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
Mar 04 #Javascript
vue请求数据的三种方式
Mar 04 #Javascript
使用Vue 自定义文件选择器组件的实例代码
Mar 04 #Javascript
JS中==、===你分清楚了吗
Mar 04 #Javascript
You might like
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
php debug 安装技巧
2011/04/30 PHP
php封装的验证码类分享
2017/02/26 PHP
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
javascript json2 使用方法
2010/03/16 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
jquery实现文本框数量加减功能的例子分享
2014/05/10 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
js实现随机点名程序
2020/09/17 Javascript
vue使用一些外部插件及样式的配置代码
2019/11/18 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python求解平方根的方法
2015/03/11 Python
简单谈谈python中的Queue与多进程
2016/08/25 Python
python编程实现希尔排序
2017/04/13 Python
wxPython多个窗口的基本结构
2019/11/19 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
2020/03/05 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
酒店led欢迎词
2014/01/09 职场文书
工作说明书范文
2014/05/07 职场文书
出国英文推荐信
2014/05/10 职场文书
安全生产标语大全
2014/10/06 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
GO中sync包自由控制并发示例详解
2022/08/05 Golang