11.校验token和解析token获取数据代码优化

news2024/11/25 13:29:01

校验token和解析token获取数据代码优化

1665979833037

解决方案

基于ThreadLocal + 拦截器的形式统一处理

image-20210714174908075

一、使用拦截器进行统一身份鉴权

1.1定义拦截器

package com.tanhua.server.interceptor;

import com.tanhua.commons.utils.JwtUtils;
import org.springframework.web.servlet.HandlerInterceptor;

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

public class TokenInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.获取请求头中的token
        String token = request.getHeader("Authorization");

        //2.校验token合法性
        boolean verifyToken = JwtUtils.verifyToken(token);
        if(!verifyToken){
            //token失效,拦截
            response.setStatus(401);
            return false;
        }
        
        //3.放行
        return true;
    }
}

1.2注册拦截器

package com.tanhua.server.config;

import com.tanhua.server.interceptor.TokenInterceptor;
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 MvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TokenInterceptor())
                .addPathPatterns("/**")//拦截所有请求
                .excludePathPatterns(new String[]{
                        "/user/login",//获取验证码和登录不需要拦截,没有登录没有token
                        "/user/loginVerification"//
                });
    }
}

接着就可以删除掉Controller中的token校验的代码了

二、ThreadLocal统一token处理

​ ThreadLocal的存储类,可以使线程有存储数据的能力,
​ 线程内调用的方法都可以从ThreadLocal中获取同一个对象。
​ 多个线程中ThreadLocal数据相互隔离

2.1 ThreadLocal工具类

package com.tanhua.server.interceptor;

import com.tanhua.model.domain.User;

public class ThreadLocalUntils {

    private static ThreadLocal<User> tl =new ThreadLocal<>();

    //向ThreadLoad存储用户对象
    public static void setUser(User user){
        tl.set(user);
    }

    //在Threadlocal中获取用户对象
    public static User getUser(){
        User user = tl.get();
        return user;
    }

    //在Threadlocal中获取用户对象的id
    public static Long getUserId(){
        User user = tl.get();
        Long id = user.getId();
        return id;
    }

    //在Threadlocal中获取用户对象的手机号码
    public static String getUserPhone(){
        User user = tl.get();
        String mobile = user.getMobile();
        return mobile;
    }
}

2.2在拦截器校验token之后解析token获取数据构造User对象存进Threlocal中,线程处理完token后清空ThreadLocal里的数据

package com.tanhua.server.interceptor;

import com.tanhua.commons.utils.JwtUtils;
import com.tanhua.model.domain.User;
import io.jsonwebtoken.Claims;
import org.springframework.web.servlet.HandlerInterceptor;

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

//定义拦截器
public class TokenInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //1.获取请求头token
        String token = request.getHeader("Authorization");
        //2.校验token合法性
        boolean verifyToken = JwtUtils.verifyToken(token);
        if(!verifyToken){
            //token为空或失效
            response.setStatus(401);
            return false;
        }

        //3.token正常,获取token携带的用户id和手机号码构造用户存进threadlocal
        Claims claims = JwtUtils.getClaims(token);
        Integer id = (Integer) claims.get("id");
        String phone = (String) claims.get("phone");

        User user =new User();
        user.setId(Long.valueOf(id));
        user.setMobile(phone);
        ThreadLocalUtils.set(user);

        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        ThreadLocalUtils.remove();
    }
}

ion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
ThreadLocalUtils.remove();
}
}


其他的controller中可以删除token中校验token和解析token的代码,用ThreadLocalUntils获取用户id

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

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

相关文章

[附源码]Nodejs计算机毕业设计基于java旅游信息分享网站Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

二、物理层(一)通信基础

目录 1.1通信基础概念 1.2传输方式 1.2.1串行传输和并行传输 1.2.2单工通信、半双工通信和全双工通信 1.3编码与调制 1.3.1数字数据编码为数字信号 1.3.2数字数据调制为模拟信号 1.3.3模拟信号编码为数字信号 1.3.4模拟数据调制为模拟信号 1.4电路交换、报文交换与分…

装了就不舍得卸载,4款电脑必装软件,功能实用又免费

下面4款电脑软件&#xff0c;每一个都是你绝对能用得上的神器&#xff0c;可遇不可求。 1、AutoOff AutoOff是一款完全免费&#xff0c;纯绿色的电脑操作定时工具&#xff0c;功能强大且实用&#xff0c;体积不到1M&#xff0c;非常小巧&#xff0c;支持自动关机、重启、休眠、…

Mysql批量插入对比(附github仓库demo)

前言 本文记录个人使用MySQL插入大数据总结较实用的方案&#xff0c;通过对常用插入大数据的4种方式进行测试&#xff0c; for循环单条拼接SQL批量插入saveBatch()循环 开启批处理模式 最近趁空闲之余&#xff0c;在对MySQL数据库进行插入数据测试 准备工作 测试环境&…

189:vue+openlayers 上传CSV文件,导出Geojson格式文件

第189个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers上传CSV文件,导出GeoJSON文件。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示例效果使用的csv文件安装依赖配置方…

直播场控助手 | 为什么说直播场控比主播更重要?

在竞争白热化的直播时代&#xff0c;作为主播最亲密的伙伴&#xff0c;场控的作用不容忽视。 优秀的场控掌握着关键成交节点&#xff0c;实时帮助主播带节奏、促转化。在精细化直播运营中&#xff0c;优秀的场控能力胜过十位主播&#xff0c;让直播间轻松实现销量翻倍。 「帷幄…

基于jsp+mysql+ssm水果蔬菜销售系统-计算机毕业设计

项目介绍 生活中&#xff0c;人们买水果或者蔬菜都是去菜市场买&#xff0c;因为那里是卖水果、蔬菜的聚集地。农商们把水果、蔬菜从远处运到那里&#xff0c;进行销售。但是这种销售方式的不足在于每次运输的数量是有限的&#xff0c;并且运输过程中也影响了水果、蔬菜的口感…

使用 TVMC 编译和优化模型

内容一览&#xff1a;本节讲解使用 TVMC 编译和优化模型。TVMC 是 TVM 的命令驱动程序&#xff0c;通过命令行执行 TVM 功能。本节是了解 TVM 工作原理的基础。 关键词&#xff1a;TVMC TVM 机器学习 本节将介绍 TVMC&#xff08;TVM 的命令行驱动程序&#xff09;。TVM…

单片机扫盲

一、从电路到集成电路 集成电路&#xff1a;使用微器件为“积木”&#xff0c;去搭建一个具备一定功能的电路板 微器件出现之前&#xff0c;一个电路功能需要很大一块电路板才能实现&#xff0c;有了微器件电路板的体积可以降到mm级别。 IC芯片就是将电路的所有微器件集成到一…

大数据时代,数据仓库究竟是干嘛的?

前言 无论你是否专门从事大数据开发&#xff0c;作为一个开发人员&#xff0c;应该都听说过数据仓库的概念&#xff0c;那你知道为什么会出现数据仓库&#xff1f;数据仓库究竟是干嘛的吗&#xff1f;有什么价值和意义呢&#xff1f;那么本文就带到入门&#xff0c;揭开数据仓…

大数据分析工具-FineReport地产行业通用单选按钮组控件插件

1. 概述 1.1 版本 报表服务器版本 JAR 包版本 插件版本 10.0 2018-09-05 V1.3.4 9.0 2015-08-09 V1.3.2 8.0 2015-08-09 V1.3.2 1.2 应用场景 地产行业具有比较特殊的筛选需求&#xff0c;而现有的单选按钮组控件不能很好的满足这一点。我们希望可以实现多层级多…

空间音频技术与生态发展高峰论坛成功举办,业界首个Audio Vivid创作工具花瓣三维声亮相

11月26日至27日&#xff0c;UWA世界超高清视频产业联盟&#xff08;以下简称“UWA联盟”&#xff09;、上海交通大学-南加州大学文化创意产业学院、华为联合举办了“互联智慧&#xff0c;共赢未来” 超高清音视频技术与生态发展高峰论坛暨Audio Vivid空间音频工具花瓣三维声训练…

Nocas环境隔离

Nocas环境隔离配置 为了做数据和服务的管理&#xff0c;引出了环境隔离的一个概念。 Nocas中服务存储和数据存储的最外层都是一个名为namespace的东西&#xff0c;用来做最外层隔离。 .yml 配置文件中配置&#xff1a; spring:application:name: orderservicecloud:nacos:se…

OH----Usb rndis,mtp等function添加,config配置

1、驱动侧添加对应功能的驱动代码&#xff1a; 在linux中usb驱动代码中添加rndis或者mtp等功能驱动代码&#xff0c; 路径&#xff1a; linux-5.10/drivers/usb/gadget/function linux usb驱动原生功能代码一般可以直接使用&#xff0c;添加进去参与编译就能继续往下做调试了&…

【校招项目】基于C++11的muduo库

基于C11的网络库 文章目录基于C11的网络库项目介绍项目地址项目特点开发环境并发模型构建项目运行案例模块讲解ChannelPollerEventLoopBufferTimerHTTP异步日志内存池数据库连接池优化计划感谢项目介绍 本项目是参考 muduo 实现的基于 Reactor 模型的多线程网络库。使用 C 11 …

如何高效存储中高频多因子

2022年12月1日晚7点半&#xff0c;DolphinDB 进行了以「中高频多因子库存储最佳实践」为主题的直播&#xff0c;吸引了众多专业观众的注意。本文将回顾直播精彩内容。 DolphinDB 的因子库&#xff1a; 为了使广大用户更方便地实现因子计算和管理&#xff0c;助力更高效的投研…

[附源码]Node.js计算机毕业设计大学生专业实习管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

C/C++ 高精度(加减乘除)算法简单实现

文章目录前言一、基本原理1、存储方式2、计算方式二、辅助方法1、字符串转高精度2、整型转高精度3、比较4、打印三、算法实现1、加法2、减法3、乘法4、除法四、使用示例1、加法2、减法3、乘法4、除法总结前言 由于上一章《C/C 高精度&#xff08;加减乘除&#xff09;算法实现…

NetSuite资产负债表编制技巧

在最近的项目上&#xff0c;发现大家对NetSuite资产负债的编制参数缺乏足够的了解&#xff0c;导致对客户需求的支支吾吾&#xff0c;产生了沟通上的浪费。所以今朝对三个典型应用做个介绍。 1. 如何在资产负债表中选择“会计期间区间”&#xff1f; 2. 期初、发生、结余报表…

【元宇宙欧米说】Web3如何为漫画产业创造更多玩法和可能性

漫画和NFT的碰撞会产生什么火花&#xff1f;NFT如何为传统的漫画收藏增加额外价值&#xff1f;Web3时代如何为漫画带来更多玩法和可能性&#xff1f; 12月15日下午三点&#xff0c;MadManga 创始人Jun将以“Web3如何为漫画产业创造更多玩法和可能性”为题&#xff0c;与大家共…