Java基于JWT实现Token登录验证+自定义异常

Java基于JWT实现Token登录验证 Java基于JWT实现Toekn登录验证,内部有自定义注解,HandlerInterceptor、WebMvcConfigurer用法。 阅读详情

一、JWT是什么?

1、先看利用token登录的实现流程:

1、客户端使用账号密码登录
2、服务端接受到请求验证账号和密码
3、服务端验证请求后,会生成一个token,并把token返回给客户端
4、客户端收到token,并存储起来,在每次请求的时候带上这个token,可以在head中携带
5、服务端接受到请求后,验证token,如果验证成功,则返回请求数据

2、JWT介绍:

JWT代表JSON Web Token,是一种用于在网络上安全地传输信息的开放标准(RFC 7519)。它以紧凑和自包含的方式表示信息,通常用于在用户和服务之间传递身份验证和授权信息。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

3、JWT的验证流程:

1、解析Token: 首先,将收到的JWT分割成头部、载荷和签名三个部分。这个过程通常会使用编程语言中相应的库或函数来完成。

2、验证头部和签名: 获取JWT中的头部和载荷信息后,根据头部中指定的加密算法和使用的密钥(通常是一个密钥或公钥)对头部和载荷进行签名验证。验证过程会使用相同的算法和密钥来生成签名,并将生成的签名与JWT中的签名进行比较,以确认JWT的完整性和真实性。

3、检查有效期和其他声明: JWT中的载荷部分可能包含了诸如令牌的过期时间(Expiration Time)等声明。在验证过程中,需要检查这些声明以确保令牌在有效期内,并可能进行其他额外的声明验证,如角色、权限等。

4、可选的其他验证步骤: 根据需求,还可以进行其他的验证步骤,比如验证令牌是否在黑名单中,是否与存储的用户信息匹配等。

JWT的验证流程主要依赖于对JWT规范和实现的理解,以及使用的编程语言或框架提供的相应功能。在验证JWT时,确保密钥的安全性是非常重要的,因为泄露密钥可能会导致令牌被篡改或伪造。

二、使用步骤

1.user数据库(代码演示是配置在yml文件上)

在这里插入图片描述

2.项目结构

在这里插入图片描述

3.相关依赖

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
            <version>2.5.2</version>
        </dependency>

        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.18.2</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
    </dependencies>

4.代码

User:

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    @TableField(value = "user_name")
    private String userName;

    @TableField(value = "password")
    private String password;
}


UserDao:

@Mapper
public interface UserDao extends BaseMapper<User> {
}

UserService:


public interface UserService {

    User loing(String userName, String userPassword);

    List<User> getUserList();

}

UserServiceImpl:

@DS("master")
@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserDao userDao;

    @Value("${login.userName:admin}")
    private String name;
    @Value("${login.password:123456}")
    private String password;

    @Override
    public User loing(String userName, String userPassword) {
//        //查表方式
//        Map<String, Object> map = new HashMap<>();
//        map.put("user_name", userName);
//        map.put("password", userPassword);
//        List<User> users = userDao.selectByMap(map);
//        if (CollectionUtils.isEmpty(users)){
//            return null;
//        }
//        return users.get(0);
        if (Objects.equals(userName,name) && Objects.equals(userPassword,password)){
            User user = new User();
            user.setUserName(name);
            user.setPassword(password);
            return user;
        }
        return null;
    }

    @Override
    public List<User> getUserList() {
        return userDao.selectList(null);
    }

}

TokenUtil:

public class TokenUtil {
    /**
     * 设置延期的时间 x分钟
     * x*1000*60
     */
    private static final long EXPIR_DATE = 60000;
//    private static final long EXPIR_DATE = 3600000;

    /**
     * 设置token的秘钥
     */
    private static final String TOKEN_SECRET = "kb_resource_qwe12300czx";


    /**
     * 获取token
     *
     * @param userName
     * @param passWord
     * @return
     */
    public static String getTokenSecret(String userName, String passWord) {
        String token = "";
        try {
            // 过期时间
            Date date = new Date(System.currentTimeMillis() + EXPIR_DATE);
            // 设置头部信息
            Map<String, Object> head = new HashMap<>();
            head.put("typ", "JWT");
            head.put("alg", "HS256");

            // 设置秘钥
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);

//            JWT.create().setHeader()
            // 生成签名

            token = JWT.create()
                    .withHeader(head)
                    .withClaim("userName", userName)
                    .withClaim("passWord", passWord)
                    .withExpiresAt(date)
                    .sign(algorithm);
        } catch (Exception e) {
           throw new RuntimeException(e);
        }
        return token;
    }

    /**
     * 验证token
     *
     * @param token
     * @return
     */
    public static DecodedJWT verify(String token) {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            return verifier.verify(token);
    }
}

全局异常&自定义异常

@Setter
@Getter
public class MeException extends Exception {
    private String msg;
    private int code = 500;
    private Map<String, Object> map;

    public MeException(String msg) {
        super(msg);
        this.msg = msg;
    }

    public MeException(String msg, Throwable cause) {
        super(msg, cause);
        this.msg = msg;
    }

    public MeException(String msg, int code) {
        super(msg);
        this.msg = msg;
        this.code = code;
    }

    public MeException(String msg, int code, Map<String, Object> map) {
        super(msg);
        this.msg = msg;
        this.code = code;
        this.map = map;
    }

}
@RestControllerAdvice
public class GlobalExceptionHandler
{
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);


    /**
     * 业务异常
     */
    @ExceptionHandler(MeException.class)
    public Object handleServiceException(MeException e, HttpServletRequest request)
    {
        log.error(e.getMessage(), e);
        return ApiResponse.error(e.getMessage());
    }

}

ApiResponse:

@Data
public class ApiResponse {
    private int status;
    private String msg;
    private Object data;

    public ApiResponse(int status, String msg, Object data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    // Getters and Setters

    // Optional: You can also add static methods to create common response objects.
    public static ApiResponse success(Object data) {
        return new ApiResponse(200, "Success", data);
    }

    public static ApiResponse error(String message) {
        return new ApiResponse(500, message, null);
    }
}

LoginController:

@Controller
@RequestMapping("/login")
public class LoginController {


    @Resource
    private UserService userService;

    @RequestMapping("/toLogin")
    @ResponseBody
    public ApiResponse toLogin(String userName, String userPassword, HttpServletResponse response){
        User user = userService.loing(userName, userPassword);
        JSONObject jsonObject = new JSONObject();

        if(user == null){
            return ApiResponse.error("账号或者密码错误,请重试!");
        }

        String token = TokenUtil.getTokenSecret(userName, userPassword);
        jsonObject.put("token", token);
        response.setHeader("token", token);
        Cookie cookie = new Cookie("token", token);
        cookie.setPath("/");
        response.addCookie(cookie);

        return ApiResponse.success(jsonObject);
    }

    @UserLoginToken
    @RequestMapping("/list")
    @ResponseBody
    public ApiResponse list(){
        List<User> userList = userService.getUserList();
        return  ApiResponse.success(userList);
    }
//    @UserLoginToken
    @RequestMapping("/test")
    @ResponseBody
    public ApiResponse test(){
        return  ApiResponse.success("请求成功");
    }

}

UserLoginToken(自定义注解)

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserLoginToken {

    boolean required() default true;
}

LoginrequiredInterceptor

@Component
public class LoginrequiredInterceptor implements HandlerInterceptor {

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

        String token = request.getHeader("token");

        if(handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();

            if (method.isAnnotationPresent(UserLoginToken.class)) {
                UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);

                if(userLoginToken.required()){
                    if(token == null){
                        throw new RuntimeException("token为空,请重新登录");
                    }else{
                        //查询用户是否存在
                        // 验证token
                        try {
                            TokenUtil.verify(token);
                        } catch (Exception e) {
                            if (e instanceof TokenExpiredException || e instanceof InvalidClaimException) {
                                // 触发刷新AccessToken的操作
                                throw new MeException("登录令牌鉴权失败,令牌超时");
                            } else {
                                // 签名失效的场景
                                throw new MeException("登录令牌鉴权失败," + e.getMessage());
                            }
                        }
                        return  true;
                    }
                }
            }
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }
}

WebMvcConfig

@Component
public class WebMvcConfig implements WebMvcConfigurer {

    @Resource
    private LoginrequiredInterceptor loginrequiredInterceptor;


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginrequiredInterceptor)
                .excludePathPatterns("/login/toLogin")
                .addPathPatterns("/**");
    }

}

三、测试

1.token过期时间校验,自定义异常

在这里插入图片描述
在这里插入图片描述

【java】[登录验证]-----JWT、Token、Session 三种登录验证方案应用场景、及其原理详细教程 JWT(JSON Web Token)是一种基于JSON的开放标准,用于安全传输信息作为JSON对象。其结构分为头部、载体和签名三部分,通过用户信息+密钥加密生成签名,服务端验证签名合法性。由于密钥仅服务端持有,可确保安全性,但需注意载体避免存放敏感信息(Base64可逆)。实战中可使用JJWT库实现令牌生成、验证和解析,结合拦截器完成身份认证流程。典型流程包括:用户登录后生成JWT令牌,后续请求通过Authorization头携带令牌,拦截器验证合法性后放行。该方案无状态、可扩展性强,适合分布式系统认证。 阅读详情

相关推荐

实例详解:Java使用JWT和Redis实现高效单点登录(SSO)

单点登录(Single Sign-On,简称SSO)是一种身份验证和访问控制机制,允许用户使用一组凭证(如登录名和密码)登录到多个应用程序中,而无需为每个应用程序单独进行身份验证。用户只需要登录一次就可以访问所有系统的应用和资源。相对于传统的每个系统都需要登录一次的方式,单点登录可以提高用户体验,降低用户的登录成本。在本文中,我们将通过使用JWT(JSON Web Token)和Redis来实现SSO功能,并提供详细的Java代码实例。通过结合JWT和Redis,我们可以轻松实现单点登录(SSO)的功能。

Da_zhenzai的博客 4215

Java简单快速入门JWT(token生成与验证)

java jwt简单了解并快速上手

greatming666的博客 1万+

spring secuity(三更草堂)

一、介绍 spring security是spring家族的一个安全管理框架,适用于大中型项目。 shiro也是一个安全管理框架,但他适用于小型项目。 安全框架主要做两件事: 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户 授权:判断登录后的用户是否有权限进行某个操作 二、快速入门 首先添加依赖,启动项目即可: <!--安全框架springsecurity依赖--> <dependency> <g

放下键盘 6445

Java实现Token登录验证(基于JWT的token认证实现)

文章目录一、JWT是什么?二、使用步骤1.项目结构2.相关依赖3.数据库3.相关代码三、测试结果 一、JWT是什么? 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程: 1、客户端使用用户名和密码请求登录 2、服务端收到请求,验证用户名和密码 3、验证成功后,服务端会签发一个token,再把这个token返回给客户端 4、客户端收到token后可以把它存储起来,比如放到cookie中 5、客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中

javaeEEse的博客 2万+

SpringBoot结合JWT+Shiro+Redis实现token无状态登录授权

SpringBoot结合JWT+Shiro+Redis实现token无状态登录授权 文章目录SpringBoot结合JWT+Shiro+Redis实现token无状态登录授权一、引言二、相关说明三、项目准备配置四、实现颁发token4.1. 配置Redis:RedisConfig4.2. 编写工具类4.3. 编写登录接口:LoginController五、实现Shiro授权5.1. 重写过滤器:J...

ljlj8888的博客 1万+

SpringBoot继承JWT token实现权限的验证(从头开始)

在开发后端接口时,数据的直接暴露可能会导致安全问题。为了应对这种情况,我们需要在访问接口时进行拦截验证,以确保只有经过身份验证的用户才能访问数据。为实现这一目的,我们需要编写一个拦截器,用于检查每次请求中是否携带有效的token(即身份验证令牌)。只有当用户携带有效token时,才能进行数据访问操作;否则,将对请求进行拦截并禁止访问敏感数据。通过编写拦截器实现身份验证,我们能够提高系统的安全性并保护数据免受未经授权的访问。这种做法有助于规避潜在的安全风险,有效保障系统的信息安全。

aabbbccc6788123的博客 2962

结合Spring Security 框架+ JWT,Java实现短信验证码、账号密码Token认证登录

本文介绍了基于Spring Security实现双因素认证(账号密码+短信验证码)的技术方案。系统采用JWT令牌进行无状态认证,关键实现包括:1)自定义安全配置类整合多种认证方式;2)SM3国密算法加密存储密码;3)SM2非对称加密保障传输安全;4)JWT过滤器实现Token校验与续期;5)异常处理机制精细化权限管控。方案通过组合AuthenticationProvider、自定义UserDetailsService和密码编码器等核心组件,构建了支持多种登录方式的安全认证体系,同时确保密码在传输和存储过程中

Mai_Jun_Hao的博客 1268

JWT 实现token验证

1. 什么是JWT JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用 户和服务器之间传递安全可靠的信息。一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。 头部(Header) 头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以 被表示成一个JSON对象。 {"typ":"JWT","alg":"HS256"} 在头部指明了签名算法是HS256算法。 我们进行BASE64编 码http://base64.xpcha.c

weixin_41446608的博客 1676

springboot-shiro-jwt-redis实现用户登录的认证与授权(前后端分离)需要有一定shiro、jwt、redis、springboot基础

shiro-jwt-redis实现后端认证授权工作

qq_50518856的博客 1620

KEGG两类报错--①No gene can be mapped--②URL ‘https://rest.kegg.jp/link/hsa/pathway‘…

版本问题,重新安装一下clusterProfiler包。网络问题,可以等待之后再试一下(试过不是)(以上可以排除基因不存在的错误因素)

weixin_57699783的博客 2万+

Autosar开发实战:DaVinci Configurator Pro新建工程保姆级教程(附目录结构解析)

本文详细介绍了使用DaVinci Configurator Pro创建Autosar工程的完整流程,包括环境准备、工程配置、目录结构解析及常见问题排查。通过实战演示和深度解读,帮助开发者快速掌握工具使用技巧,优化工程管理,提升开发效率。特别适合需要理解Autosar开发中DaVinci Config工具链的工程师。

weixin_30872157的博客 455

Spring Boot-6.0集成JWT

在pom.xml中引入 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.10.3</version> </dependency> 自定义注解 LoginToken: package com.wxf.springboot.annotation; import j

大雪纷斐的博客 362

《大明王朝1566》中,朝廷财政危机无法解决的根源分析

财政困局中的财富最终流向三重黑洞:​皇室挥霍​(如嘉靖炼丹修殿)、特权阶层贪腐​(严党年入百万两盐税)、制度性损耗​(宗室供养、低效官僚)。更深层的“钱”其实是被禁锢在道德化治理的牢笼中——当国家用“黄河长江皆可为用”的权术思维替代制度性改革时,财政危机便成为帝制王朝无法逃脱的宿命。

为了小家奋斗 1968

JWT入门操作

JWT结构 header.payload.signature (头部,有效载荷,签名) 快速入门: 导入坐标: <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version&

qq_45242076的博客 260

手把手教你学simulink实例--基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台

电动汽车的动力总成(Powertrain)是车辆的核心系统,包括动力电池、电机控制器、逆变器和驱动电机等关键部件。动力总成的控制策略直接影响车辆的动力性能、能耗效率和驾驶体验。为了验证和优化这些控制策略,基于MATLAB/Simulink的仿真平台成为一种高效且经济的解决方案。本项目旨在构建一个完整的基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台,涵盖控制策略建模、性能评估以及参数标定等功能模块,并通过仿真验证系统的有效性。

MHD0815的博客 298

【网络安全 | 渗透工具】Hydra安装使用详细教程

Hydra,也称九头蛇,是一款非常强大的暴力破解工具(密码能否被破解关键在于字典是否足够强大),支持多种服务协议的账号和密码进行爆破,包括Web登录、数据库、SSH、FTP等服务,支持Linux、Windows、Mac平台安装。该工具支持以下协议的爆破:Hydra在kali中自带,这里介绍windows下的安装方法。zip下载地址:https://gitcode.com/maaaaz/thc-hydra-windows/tree/master下载完成后解压: 再将thc-hydra-windows-mast

等风来 9200

极简版springboot项目的统一异常处理编写

接口层编写 业务层实现方法编写 其中业务层调用的工具类编写为 其中注解解析yml文件中的参数outTime是设置token存活时长,单位为毫秒 所调用的mapper层的login方法是根据username 和 password查询返回一个员工对象

yqchenming的博客 259

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1233

webservice自定义标签及获得httpservletrquest

详见E:\学习文档子目录压缩\专项进阶,如ngnix,webservice,linux等\webservice\webservice springcxfservice3自定义标签及获得httpservletrquest写发布接口类的接口package com.xiang.iwebservice;  import javax.jws.WebMethod;import javax.jws.WebPar...

香帅的博客 728

【FISCO BCOS】二十、多机部署区块链

实际开发中,为了满足高可用性和高容错性的需求,往往会采用多级部署区块链的方式,今天介绍一下FISCO BCOS的多机部署流程。

naihe_fish的博客 3649

第21章—技术管理篇(上):身为技术人该怎样带好团队并做好管理者

上节讲了职业规划和学习提升这两个话题,随着职业规划的不断落地,或者自己能力的不断提升,大家也会逐渐被提拔成“职级更高”的人。企业规模扩张时,员工数量也会变多,意味着Boss需要更多的人来辅助管理,而管理者会从外部招聘吗?也许会,但大多企业更喜欢从内部选拔,毕竟人的天性更希望找的人值得信赖。此时,一些能力不错、做事靠谱的老员工,就会被“赶上”管理者的位子。作管理不难,但想要“”就需要一定情商。

运维老生常谈 1366

JWT登录验证,创建Token,设置Token过期时间

JWT登录验证Token,创建Token,设置登录过期时间创建Token工具类创建自定义注解配置拦截器编写自定义拦截器 创建Token工具类 public class TokenUtil { /** * 解析Token 解析Token 传换成Clasims类 * @param token * @return */ public static Claims parseToken(String token){ try { Claims claims = Jwts.parser()

lzm19930310的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SpringBoot实现基于token的登录验证

SpringBoot实现基于token的登录验证        基于token的登录验证实现原理:客户端通过用户名和密码调用登录接口,当验证数据库中存在该用户后,将用户的信息按照token的生成规则,生成一个字符串token,返回给客户端,客户端在调用其他接口的时候,需要在请求头上带上token,来验证登录信息        Demo实现代码如下: (因为除登录接口外,

qq_36816062的博客 9981

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java Token登录验证 使用jjwt生成和解析JWT

刚学会了点使用Token凭证来验证登录,记录下来 参考 JSON Web Tokens官网 Libraries里有各种语言的推荐包 jjwt的Github网址 推荐里面star最多的,所以用了 jjwt官方 生成和解析的例子 前后端分离之JWT用户认证 对JWT有详细的介绍 Java安全验证之JWT实践 依赖 当时在maven仓库里找到的最新版 流程 登录成功后,在Java中生成Token...

优快云906214391的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java基于JWT的token认证

一、背景引入 由于Http协议本身是无状态的,那么服务器是怎么识别两次请求是不是来自同一个客户端呢,传统用户识别是基于seeion和cookie实现的。大致流程如下: 用户向服务器发送用户名和密码请求 用户进行校验,校验通过后创建session绘画,并将用户相关信息保存到session中 服务器将sessionId回写到用户浏览器cookie中 用户以后的请求,都会鞋带cookie发...

黑马程序员官方博客 3万+

java SpringBoot登录验证token拦截器

springBoot拦截器定义,以及token获取,单点登录设定,全局异常定义。

前方的路在刚开始 9041
上一篇: VUE学习三、前端项目部署
下一篇: easyExel模板导出,样式设置
TimerShaft
博客等级 码龄8年 33粉丝 37原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值