SpringBoot2+Vue2实战(七)springboot集成jwt

news2024/12/31 6:17:51

一、集成jwt

JWT依赖

 <!-- JWT -->
 <dependency>
     <groupId>com.auth0</groupId>
     <artifactId>java-jwt</artifactId>
     <version>3.10.3</version>
 </dependency>

UserDto

import cn.hutool.core.annotation.Alias;
import lombok.Data;

@Data
public class UserDto {

    private String username;

    private String password;

    @Alias("nickname")
    private String nickname;

    private String avatarUrl;

    private String token;
}

UserServiceImpl

@Override
    public UserDto login(UserDto userDto) {
        User one = getUserInfo(userDto);
        if (one != null){
            BeanUtil.copyProperties(one,userDto,true);
            //设置token
            String token = TokenUtils.getToken(one.getId().toString(), one.getPassword());
            userDto.setToken(token);
            return userDto;
        }else {
            throw new ServiceException(Constants.CODE_600,"用户名或密码错误");
        }
    }

TokenUtils

生成token

import cn.hutool.core.date.DateUtil;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;

public class TokenUtils {

    /**
     * 生成Token
     * @return
     * */
    public static String getToken(String userId,String sign){
        return JWT.create().withAudience(userId) // 将 user id 保存到 token 里面 作为载荷
                .withExpiresAt(DateUtil.offsetHour(new Date(),2)) //两小时后token过期
                .sign(Algorithm.HMAC256(sign)); // 以 sign 作为 token 的密钥

    }
}

request.js

放开请求头,并从浏览器获取user对象

//从浏览器中获取user
    let user = localStorage.getItem("user")?JSON.parse(localStorage.getItem("user")):{}
    if (user){
        config.headers['token'] = user.token;  // 设置请求头
    }

JwtInterceptor

Token验证


import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.example.springboot.common.Constants;
import com.example.springboot.entity.User;
import com.example.springboot.exception.ServiceException;
import com.example.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

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

public class JwtInterceptor implements HandlerInterceptor {

    @Autowired
    private UserService userService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String token = request.getHeader("token");
        //如果不是映射方法,直接通过
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        if (StrUtil.isBlank(token)) {
            throw new ServiceException(Constants.CODE_401, "无token,请重新登录");
        }
        //获取token中的userid
        String userId;
        try {
            userId = JWT.decode(token).getAudience().get(0);
        } catch (JWTDecodeException j) {
            throw new ServiceException(Constants.CODE_401, "token验证失败");
        }
        //根据token中的userid查询数据库
        User user = userService.getById(userId);
        if (user == null) {
            throw new ServiceException(Constants.CODE_401, "用户不存在,请重新登录");
        }
        //验证token
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
        try {
            jwtVerifier.verify(token);
        } catch (JWTVerificationException e) {
            throw new ServiceException(Constants.CODE_401, "token验证失败,请重新登录");
        }
        return true;
    }
}
InterceptorConfig 
拦截器
import com.example.springboot.config.interceptor.JwtInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(jwtInterceptor())
                //拦截所有请求通过判断token是否合法来决定是否需要登录
                .addPathPatterns("/**")
                //放行
                .excludePathPatterns("/user/login","/user/register","/**/export","/**/import");
    }

    @Bean
    public JwtInterceptor jwtInterceptor(){
        return new JwtInterceptor();
    }
}

request.js

加入token验证信息提示

//当权限验证不通过时提示
        if (res.code === '401'){
            ElementUI.Message({
                message:res.msg,
                type:"error"
            })
        }
        return res;
    },

二、获取用户对象信息

TokenUtils


    public static UserService staticUserService;


    @Resource
    private UserService userService;

    @PostConstruct
    public void setUserService() {
        staticUserService = userService;
    }



 /**
     * 获取当前登录的用户信息
     *
     * @return
     */
    public static User getCurrentUser() {
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            String token = request.getHeader("token");
            if (StrUtil.isNotBlank(token)) {
                String userId = JWT.decode(token).getAudience().get(0);
                return staticUserService.getById(Integer.valueOf(userId));
            }
        } catch (Exception e) {
            return null;
        }
        return null;
    }

UserController

//分页查询 mybatis-plus方式
    @GetMapping("/selectPage")
    public Result selectPage(@RequestParam(defaultValue = "") String username,
                             @RequestParam Integer pageSize,
                             @RequestParam Integer pageNum,
                             @RequestParam(defaultValue = "") String email,
                             @RequestParam(defaultValue = "") String address) {

        IPage<User> page = new Page<>(pageNum, pageSize);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("id");
        if (!"".equals(username)) {
            queryWrapper.like("username", username);
        }
        if (!"".equals(email)) {
            queryWrapper.like("email", email);

        }
        if (!"".equals(address)) {
            queryWrapper.like("address", address);
        }
        //获取当前用户信息
        User currentUser = TokenUtils.getCurrentUser();
        System.out.println("获取当前用户信息============" + currentUser.getNickname());
        return success(userService.page(page, queryWrapper));
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/704747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据库】mysql 管理员密码丢失解决方案

本次操作环境是mysql5.7.24版本 问题&#xff1a;由于各种原因&#xff0c;数据库管理员密码丢失&#xff0c;无法登陆数据库 解决方法&#xff1a; 1、进入my.cnf文件进行修改配置 在[mysqld]下添加 skip-grant-tables 2、重启mysql服务 service mysql stop service mysql …

Fiddler如何延迟接口响应时间

需求描述&#xff1a;通过延迟接口响应时间来mock响应超时的测试场景 解决方法&#xff1a; 使用fiddler模拟接口延时请求&#xff0c;fiddler设置参数如下&#xff1a;

淘宝再夺顶级技术比赛CVPRNTIRE冠军,背后是这些提升用户体验的内容技术

不知不觉间&#xff0c;内容电商似乎已经成为人们生活中不可或缺的存在&#xff1a;在闲暇时间&#xff0c;我们已经习惯于拿出手机&#xff0c;从电商平台的直播间随手下单自己心仪的商品。 尽管优质的货品、实惠的价格、精致的场景布置、有趣的内容输出都是非常关键的影响因…

【JavaScript】文档注释详解

文章目录 什么是文档注释为什么要写文档注释不使用文档注释存在的隐患使用函数成员时的书写问题调用函数时功能使用问题 文档注释官方标签函数参数标签 param参数类型 {}参数注释对象属性属性注释使用带有对象属性注释的参数 返回值标签 returns注释 作者标签 author许可证标签…

spring cloud 之 eureka

Eureka概述 Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理&#xff0c;SpringCloud将它集成在其子项目spring-cloud-netflix中 在服务注册与发现中&#xff0c;有一个注册中心。当服务器启动的时候&#xff0c;会把当前自己服务器的信息比如服务地址通讯地址…

ubuntu 显卡驱动/cuda/cudnn

显卡驱动 https://www.bilibili.com/video/BV1Zc41137tU/?spm_id_from333.999.0.0&vd_sourced75fca5b05d8be06d13cfffd2f4f7ab5 使用recommended的驱动&#xff0c;open和无open的区别在于无open更适合发挥NVIDIA显卡的全部功能和性能&#xff0c;特别是GPU加速计算等任…

K8S集群安装与部署(Linux系统)

一、环境说明&#xff1a;CentOS7、三台主机&#xff08;Master&#xff1a;10.0.0.132、Node1&#xff1a;10.0.0.133、Node2&#xff1a;10.0.0.134&#xff09; 二、准备环境&#xff1a; 映射 关闭防火墙 三、etcd集群配置 安装etcd&#xff08;Master&#xff09; [ro…

[源码分析]-xxljob(1): 整体介绍

xxljob是一种分布式的调度框架&#xff0c;所谓分布式调度&#xff0c;是指调度器和执行器不在同一个进程里&#xff0c;因此必须进行远程服务调用&#xff0c;也需要考虑高可用问题。 但是由于调度器维护的数据是落库而在各个节点间共享的&#xff0c;因此不需要考虑数据的一…

必备数据可视化工具大揭秘

探索数据的美妙世界&#xff01;我们为您带来了一份精心策划的数据可视化工具分享合集。在这个数字时代&#xff0c;数据可视化是理解和传达数据的关键&#xff0c;而这些工具将帮助您以令人惊叹的方式展现数据的潜力。 分享一&#xff1a;伙伴云 伙伴云是一个提供仪表盘和可…

vscode超炫酷的编码特效详解

1.在扩展中搜索 插件&#xff1a;Power Mode 2.在设置里搜索Code Actions On Save 3.点击在settings.json中编辑 {"powermode.enabled": true, //启动// "powermode.presets": "flames", // 火花效果 // 炸裂// "powermode.presets&quo…

织梦宏,解锁元音之谜

本篇博客会讲解力扣“2586. 统计范围内的元音字符串数”的解题思路&#xff0c;这是题目链接。 本题可以使用一个宏来判断一个字符是不是元音字母&#xff0c;接着遍历字符串数组&#xff0c;统计满足条件的字符串个数。 需要满足的条件有&#xff1a; 第一个字符是元音字母。…

微信小程序 滚动到底部加载新的数据 之后滚动到顶部

1.配置到底部监听 在app.json的window里面加入 里面的300表示距离底部300rpx触发onReachBottom事件 默认50rpx "window": {"onReachBottomDistance": 300}, 2.在数据列表的js页面 /*** 页面上拉触底事件的处理函数*/onReachBottom() {console.log("…

采用 CD4011 的温度监测自动控制电路

该电路结构简单&#xff0c;制作容易&#xff0c;由一只与非门和一只热敏电阻组成测控电路和警笛声发声电路&#xff0c;由一只继电器作为执行电路。 一、电路工作原理 电路原理如图 8 所示。 测温电阻RT接在控制门D1的输入端&#xff0c;它和电阻R1、R2及RP通过RP的分压调节…

Cesium入门之十一:认识Cesium中的Entity

目录 Entity类简介Entity在Cesium中的作用Entity的常用属性使用Entity创建点、线、面常用的Entity图形对象及其属性创建点、线、面的方法创建点创建线创建面将点、线、面添加到viewer中 修改Entity的外观和样式点&#xff08;Point&#xff09;的外观样式线&#xff08;Polylin…

蓝奥声核心技术——无线协同代理技术

1.技术背景 无线协同代理技术指基于对目标场景状态变化的协同感知而获得触发响应并进行智能决策&#xff0c;属于蓝奥声核心技术--边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术涉及物联网边缘域的无线通信技术领域&#xff0c;具体主要涉及网络服务节点与…

mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入

文章目录 背景说明 背景说明 我这里主要针对2处地方要进行增量执行sql&#xff1a; 1.新功能需要创建一张新表结构indicator_alarm_threshold2.给菜单表和另一个表新增数据 我们现在使用的是项目启动先初始化加载init-table.sql的脚本(这里面的轻易不动了&#xff0c;保持原…

浏览器测试的三大挑战及解决方案

目录 跨浏览器测试&#xff0c;为什么重要 跨浏览器测试挑战及其解决方案 自动化挑战大 解决方案&#xff1a;正确选择工具 设施维护负担大 解决方案&#xff1a;选择可靠的云服务 浏览器适配列表太多 解决方案&#xff1a;选择多版本支持的平台 总结&#xff1a; 随着…

关于Nuxt3.6兼容低版本游览器的实战以及可能存在的问题

当我们网站打包上线后&#xff0c;有些问题我们肯定也要考虑在内&#xff0c;兼容性也是其中一个重要的一种&#xff0c;可能会有人说&#xff0c;都2023年了&#xff0c;还在乎那些废弃的游览器干啥&#xff0c;我只能说&#xff0c;错&#xff01;大错特错&#xff01; 我们不…

docker方式安装gitlab

一&#xff1a;docker 方式安装gitlab 用docker来安装比较方便简单&#xff0c;包括版本升级也会变得更简单。 1、拉取gitlab镜像 gitlab-ce表示的是社区免费版本 docker pull gitlab/gitlab-ce:latest2、创建映射文件 mkdir -p /data/docker/gitlab/etc mkdir -p /data/do…

虚拟现实(VR)在医疗保健中的5种应用

医疗保健中的VR虚拟现实 虚拟现实的由来已久&#xff0c;18世纪&#xff0c;法国的医生使用布制的分娩模拟器向助产师和外科医生教授医学技术。在20世纪60年代初&#xff0c;医生一边对心肺复苏学员口述心肺复苏的技巧&#xff0c;一边使用一家塑料玩具厂家制造的塑料娃娃现场…