SSM——Spring MVC Vue token的生成和校检(三)

本文介绍了Token在Web领域的应用,阐述了在Vue前后端分离项目中使用Token的流程,包括前端登录获取、存储Token,每次请求携带Token,后端验证Token等。还给出了Token工具类、拦截器、登录控制层及前端代码,并展示了运行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是Token

在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,例如Facebook, Twitter, Google+, GitHub等。tokens 是多用户下处理认证的最佳方式。

以下几点特性会让你在程序中使用基于Token的身份验证

1.无状态、可扩展

 2.支持移动设备

 3.跨程序调用

 4.安全

二、Vue前后端分离项目中如何使用Token

1、第一次登录的时候,前端调后端的登陆接口,发送用户名和密码

2、后端收到请求,验证用户名和密码,验证成功,就给前端返回一个token

3、前端拿到token,将token存储到sessionStorage,并跳转路由页面

4、前端每次跳转路由,就判断 sessionStorage中有无 token ,没有就跳转到登录页面,有则跳转到对应路由页面

5、每次调后端接口,都要在请求头中加token

6、后端判断请求头中有无token,有token,就拿到token并验证token,验证成功就返回数据,验证失败则返回错误信息

7、如果前端拿到状态码为错误信息的状态码,就清除token信息并跳转到登录页面

三、代码

1.TokenUtil:Token工具类

package com.mall.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;

/**
 * Token工具类
 * @author : Bei-Zhen
 * @date : 2020-12-26 8:58
 */
public class TokenUtil {

    /**
     * 有效时长
     */
    private static final long EXPIRE_TIME = 24 * 60 * 60 * 1000;
    /**
     * 密钥
     */
    private static final String TOKEN_SECRET = "ben";

    /**
     * 签名生成
     * @param username
     * @return
     */
    public static String sign(String username){
        String token = null;
        try {
            Date expiresAt = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            token = JWT.create()
                    .withIssuer("auth0")
                    .withClaim("username",username)
                    .withExpiresAt(expiresAt)
                    //使用HMAC256算法加密
                    .sign(Algorithm.HMAC256(TOKEN_SECRET));
        } catch (Exception e){
            e.printStackTrace();
        }
        return token;
    }

    public static boolean verify(String token){
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256((TOKEN_SECRET)))
                    .withIssuer("auth0").build();
            DecodedJWT jwt = verifier.verify(token);
            System.out.println("认证通过");
            System.out.println("username" +jwt.getClaim("username").asString());
            System.out.println("过期时间:" + jwt.getExpiresAt());
            return true;
        } catch (Exception e){
            return false;
        }
    }
}

2.TokenInterceptor:Token拦截器

package com.mall.controller.interceptor;

import com.mall.util.TokenUtil;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Token拦截器
 * @author : Bei-Zhen
 * @date : 2020-12-26 9:27
 */
public class TokenInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String url = request.getRequestURI();
        System.out.println(url);
        if(!url.endsWith("user/login")){
            //从http请求头中取出token
            String token = request.getHeader("Authorization");
            System.out.println(token);
            //执行认证
            if(TokenUtil.verify(token)){
                return true;
            } else {
                return false;
            }
        }
        return true;
    }
}

3.登录控制层

package com.mall.controller;

import com.mall.domain.User;
import com.mall.service.impl.UserServiceImpl;
import com.mall.util.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

/**
 * @author: Bei-Zhen
 * @date: 2020-12-25 11:51
 * @description: 用户web层
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserServiceImpl userService;


    /**
     * 测试
     * @param loginUser
     * @return
     */
    @RequestMapping("/login")
    public  @ResponseBody
    Map<String,Object> login(@RequestBody User loginUser) {
        Map<String,Object> loginMap = new HashMap<>();
        Map<String,Object> dataMap = new HashMap<>();
        String token = TokenUtil.sign(loginUser.getUsername());
        dataMap.put("token",token);
        loginMap.put("data",dataMap);
        Map<String,Object> metaMap = new HashMap<>();
        User user = userService.login(loginUser);
        if(user != null){
            metaMap.put("msg","登录成功");
            metaMap.put("status",200);
        } else {
            metaMap.put("msg","登录失败");
            metaMap.put("status",0);
        }
        loginMap.put("meta",metaMap);
        return  loginMap;
    }

}

4.前端代码
在这里插入图片描述
在这里插入图片描述

四、运行效果

前端的token值
在这里插入图片描述
后端的认证
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bei-zhen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值