Vue+Vuex实现自动登录 升级版

Vue+Vuex实现自动登录 升级版

之前实现的版本在这里:Vue+Vuex实现自动登录

? ??? 在之前实现的版本中,如果你进行测试,可以看到在浏览器的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('请求失败', '失败!');
        }
      })
    }
  }
});

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

原文地址:https://www.cnblogs.com/xiaoxineryi/p/12405563.html

时间: 2024-08-29 21:35:04

Vue+Vuex实现自动登录 升级版的相关文章

浏览器插件-自动登录淘宝(-)

浏览器插件的介绍 Chrome浏览器插件开发的准备工作 manifest.json配置介绍 页面如何注入scripts文件 下一章backgroup的应用 一. 浏览器插件的介绍 浏览器插件是一种遵循一定规范的应用程序接口编写出来的,是对其进行起一个补充作用的程序,如播放Flash文件,浏览器本身是没有这个功能的,所以要通过插件来达到播放的功能. 常用的浏览器插件有: Flash插件.RealPlayer插件.ActiveX插件.雅虎插件,百度,QQ, 搜狗,新浪,360网购,抢票工具等. 二.

vue+vuex+axios+echarts画一个动态更新的中国地图

一. 生成项目及安装插件 # 安装vue-cli npm install vue-cli -g # 初始化项目 vue init webpack china-map # 切到目录下 cd china-map # 安装项目依赖 npm install # 安装 vuex npm install vuex --save # 安装 axios npm install axios --save # 安装 ECharts npm install echarts --save 二. 项目结构 ├── ind

vue+vuex实现 counter计数器

vue+vuex实现 counter计数器 框架搭建好过后输入npm run dev的时候不会直接打开浏览器,在config文件夹找到index.js文件夹 把autoOpenBrowser: false改为autoOpenBrowser: true,从新在命令行输入npm run dev,这是就会自动打开浏览器. 如图修改 现在做个简单的demo示例:counter(计数器) 一.文件夹与文件的创建 1.首先要在components文件夹下面创建counter的一个文件夹 2.然后在count

Haytham个人博客开发日志 -- Flask+Vue基于token的登录状态与路由管理

指路牌 符合一下关键词,这篇博客有可能会对你有帮助 不使用工厂函数的Flask应用 不使用蓝本的Flask应用 Flask跨域配置 基于Token的登录状态管理 Flask+Vue Vue路由拦截 Axios 钩子 适用场景 这是一篇个人博客搭建的记录博客,也是一篇关于Flask和Vue的简单"工具书",最后的代码会包含Web开发中常用的功能.(不全,只是使用频率相对高的) 环境 系统: 无关 Flask(Python3) Vue(Node.js) 参考 <Flask Web开发

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

目录(?)[+] 前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时继续介绍Selenium+Python官网Locating Elements部分内容.        希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~        [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)        

Filter自动登录

Dao层略过 Domain略过 Service层过 Web层 Select逻辑 获取表单数据,Web-service--Dao返回用户信息 如果返回不为null否则,重定向到登录页面.则判断用户是否勾选7天免登录,如果勾选(判断一下).把用户数据存入session域中,并且要创建一个cookie设置时间为7天,保存cookie中.  select代码: public void doGet(HttpServletRequest request, HttpServletResponse respon

python自动化,自动登录并且添加一个门店

''' 本文主要通过以前公司的对外平台,测试自动登录并且自动添加一个门店 ''' # _*_ coding: utf-8 _*_ from selenium import webdriverimport timedriver = webdriver.Chrome()driver.maximize_window()driver.get("http://121.41.42.104:18888")driver.find_element_by_name("UserName"

Azure 基础:用 PowerShell 自动登录

PowerShell 是管理 Azure 的最好方式,因为我们可以使用脚本把很多的工作自动化.比如把 Azure 上的虚拟机关机,并在适当的时间把它开机,这样我们就能节省一些开支,当然我们同时也为减少二氧化碳的排放做出了贡献! PowerShell 的 Azure 模块中为我们提供了不同的 API, 早期的叫 ASM(Azure Service Manager).随着 Azure 的发展变化,又出现了一套新的 API 叫 ARM(Azure Resource Management).我们这里仅介

windows2008r2设置开机后用户自动登录

因为有些程序在计划任务中设置开机就启动以后,当登录帐号时无法将已经运行的程序切换到前台进行操作(就是无法在桌面上显示软件的界面,比如我这里需要使用的<vm虚拟机>.<v-box虚拟机>和<typsoft ftp服务器>这几个软件),想了一下,感觉可以通过设置开机自动登录帐号后再启动程序的方法解决,于是在网上找了下设置的方法: 设置开机自动用户登录 开始>运行 control userpasswords2 ,出现(如图1),选择要自动登录的用户账户,然后将"