拦截器和jwt的联合使用

基于SpringBoot与JWT的RBAC权限系统实战:从设计到缓存优化 权限管理是保障业务系统安全的基石,其核心在于控制用户对资源的访问。基于角色的访问控制(RBAC)模型通过将权限赋予角色、再将角色赋予用户,实现了权限与用户的解耦,极大地提升了管理效率与系统可维护性。在技术实现上,结合JWT(JSON Web Token)可实现无状态认证,有效支撑分布式架构;而利用缓存策略(如Redis)则能显著提升高频权限校验的性能。本文聚焦于工程实践,详细解析如何运用SpringBoot、MyBatis与MySQL技术栈,构建一个支持权限分级、具备高效查询与缓存机制的RBAC权限管理系统 阅读详情

(一)

在config层设置所要拦截的页面 LoginConfig
package com.bim.bimbookshop.config;
​
import com.bim.bimbookshop.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
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 LoginConfig implements WebMvcConfigurer {
​
    @Autowired
    private LoginInterceptor loginInterceptor;
​
    /**
     * 有没有这个login都打不开
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)//添加拦截器
                 .addPathPatterns("/**")  //配置拦截路径
                 .excludePathPatterns("/login/**","/static/**","/templates/**");//配置排除路径
    }
}
注意:上面的"/login/**"表示/login下的所有路径,所有如果登录页面路径为时,就要额外添加"/"
eg:.excludePathPatterns(  // 配置排除路径,以下请求不会被拦截
                        "/login",          // 登录页面
                        "/login/**",       // 登录相关的请求,如登录表单提交
                        "/register",       // 注册页面
                        "/register/**",    // 注册相关的请求
                        "/static/**",      // 静态资源,如CSS、JS、图片等
                        "/css/**",         // CSS文件
                        "/js/**",          // JavaScript文件
                        "/images/**",      // 图片文件
                        "/favicon.ico",    // 网站图标
                        "/error"           // 错误页面
                )
在interceptor 或 handle 层配置拦截器实现类 LoginInterceptor
package com.bim.bimbookshop.interceptor;
​
import com.bim.bimbookshop.util.JwtUtil;
import io.jsonwebtoken.Claims;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
​
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
​
/**
 * 拦截器
 */
@Component
public class LoginInterceptor implements HandlerInterceptor {
​
    /**
     * 除了登录请求以外的其他请求都要进行过滤
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for (Cookie cookie:cookies){
                if("token".equals(cookie.getName())){
                    String userToken = cookie.getValue();
                    if(!StringUtils.hasText(userToken)){
                        response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
                    }
                    //解析token看看是否成功
                    try {
                        Claims claims = JwtUtil.parseJWT(userToken);
                        claims.getSubject();
                    }catch (Exception e){
                        //e.printStackTrace();
                        System.out.println("token信息出错");
                        return false;
                    }
                    return true;  //放行
                }
            }
        }
        return false;
    }
}
在util层创建JWT实现类 JwtUtil
package com.qcby.springboot.util;
​
/**
 * JWT工具类
 */
​
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
​
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.*;
​
public class JwtUtil {
    //有效期为
    public static final Long JWT_TTL = 60 * 60 *1000L;// 60 * 60 * 1000
    //设置秘钥明文
    public static final String JWT_KEY = "qcby";
​
    /**
     * 创建token
     * @param subject
     * @return
     */
    public static String createJWT(String subject) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
​
        long expMillis = nowMillis + JwtUtil.JWT_TTL;
        Date expDate = new Date(expMillis);
        SecretKey secretKey = generalKey();
​
        JwtBuilder builder = Jwts.builder()
                .setId(UUID.randomUUID().toString())              //唯一的ID
                .setSubject(subject)   // 主题  可以是JSON数据
                .setIssuer("wd")     // 签发者
                .setIssuedAt(now)      // 签发时间
                .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(expDate);// 设置过期时间
        return builder.compact();
    }
​
    /**
     * 生成加密后的秘钥 secretKey
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }
​
    /**
     * 解析
     * @param jwt
     * @return
     * @throws Exception
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
​
    public static void main(String[] args) {
        String token = JwtUtil.createJWT("qd");
        System.out.println(token);
    }
​
}
加入JWT依赖
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

最后在登录成功后根据用户ID创建token
public ResponseResult Login(Login login,HttpServletResponse response){
    。。。
    。。。
    。。。
    //创建token
    String token = this.jwtUtil.createJWT(String.valueOf(user.getUserId()));
    //将token信息设置如cookie当中,并且将cookie传到http
    Cookie cookie = new Cookie("token",token);
    cookie.setPath("/");   //代表cookie的值将会被发送到服务器上的所有路径
    cookie.setMaxAge(36000); //设置cookie的过期时间
    response.addCookie(cookie);//将Cookie添加到响应中
    。。。
    return;
}

注意:在拦截器实现类 LoginInterceptor 中会拿到存在cookie中的token的值

=======================================================================================

(二)

加入JWT依赖
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
配置JWT环境
spring:
    。。。
    。。。
jwt:
  secret: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4K67DMlSPXbgG0MPp0gH
  expire: 86400000
  #  expire: 10000
  subject: door
在util层创建JWT实现类 JwtUtil
package com.southwind.util;
​
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
​
import java.util.Date;
import java.util.UUID;
​
@ConfigurationProperties(prefix = "jwt")
@Component
public class JwtUtil {
    private long expire;
    private String secret;
    private String subject;
​
    /**
     * 生成token
     *
     * @param userId
     * @return
     */
    public String createToken(String userId) {
        String token = Jwts.builder()
                //载荷:自定义信息
                .claim("userId", userId)
                //载荷:默认信息
                .setSubject(subject) //令牌主题
                .setExpiration(new Date(System.currentTimeMillis() + expire)) //过期时间
                .setId(UUID.randomUUID().toString())
                //签名哈希
                .signWith(SignatureAlgorithm.HS256, secret)
                //组装jwt字符串
                .compact();
        return token;
    }
​
    public boolean checkToken(String token){
        if(StringUtils.isEmpty(token)){
            return false;
        }
        try {
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
        } catch (Exception e) {
            return false;
        }
        return true;
    }
​
    public long getExpire() {
        return expire;
    }
​
    public void setExpire(long expire) {
        this.expire = expire;
    }
​
    public String getSecret() {
        return secret;
    }
​
    public void setSecret(String secret) {
        this.secret = secret;
    }
​
    public String getSubject() {
        return subject;
    }
​
    public void setSubject(String subject) {
        this.subject = subject;
    }
}

spring boot jwt Interceptor 例子 spring boot jwt 和 interceptor的例子。 其中jwt的例子网上有很多,但是都是要数据库支持,这个只是用假数据模拟,不需要数据库支持。另外还有一个拦截器的简单例子。已经在sts 4 测试通过。 立即下载

相关推荐

Hypermesh2021实战:塑料圆盘结构化网格划分全流程(附避坑指南)

本文详细介绍了使用Hypermesh2021进行塑料圆盘结构化网格划分的全流程操作,包括几何预处理、网格生成策略及质量验证。特别针对工程实践中常见的12个典型问题提供解决方案,帮助用户提升CAE仿真分析的精度和效率。

weixin_29294597的博客 318

简单的鉴权登录-java后端实现部分(JWT令牌+拦截器Interceptor)

拦截器的主要是基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在Service或者一个方法前调用一个方法,或者在方法后调用一个方法,甚至在抛出异常的时候做业务逻辑的操作。拦截器的作用类似于Servlet中的Filter,都可以用于对处理器进行预处理和后处理。在Spring MVC 与Spring Boot 中使用拦截器一般是实现接口。拦截器的作用:拦截请求,在指定方法调用前后,根据业务需要执行预先设定的代码。

WWX19990724的博客 3606

CH582低功耗实战:从1.2mA降到5uA,我的蓝牙广播功耗优化笔记

本文详细记录了沁恒CH582蓝牙芯片从1.2mA降至5μA的功耗优化全过程。通过建立基准测试环境、分层排查软件配置与IO状态、精细调优射频参数以及硬件层面的电源管理,实现了极致的低功耗表现。文章还提供了实用的功耗测量方法和典型问题排查指南,为蓝牙设备开发者提供了宝贵的参考经验。

weixin_30368405的博客 572

Web-JWT登录功能实现(含拦截器)

就是你比如复制一个url用一个未曾登陆对应url系统的浏览器访问他会先进入登陆页面登陆校验就是实现这个功能简而言之,就是不能让你直接访问内部数据,要先登陆才可以首先http协议是无状态的每次请求都是独立的而我们浏览器和web服务器之间就是http协议实现思路存一个登陆标记每个请求前有if判断对应队列标记登陆就正常执行,没有登陆就去登陆界面但是:这样太繁琐了所以我们使用统一拦截来做对应技术主要介绍登陆标记(会话技术)和统一拦截呗三部分之间用.隔开。

y_k_j_c的博客 1748

[特殊字符] 智能补货(AI-driven Replenishment)完整实施方案

补货量=预测需求+安全库存−当前库存补货量 = 预测需求 + 安全库存 - 当前库存补货量=预测需求+安全库存−当前库存。:基于 LSTM/Transformer 预测未来 30/60/90 天的销量。

nbsaas-boot基于Request-Response的企业级快速开发框架 967

PDF格式分析(一)简介

概述 PDF文件是一种编程形式的文档格式,它所有显示的内容,都是通过相应的操作符进行绘制的。 PDF基本显示单元包括:文字,图片,矢量图,图片 PDF扩展单元包括:水印,电子署名,注释,表单,多媒体,3D PDF动作单元:书签,超链接(初学者可以简单这么理解,对于研究比较深入的人员来说,拥有动作的单元有很多个,包括电子署名,多媒体,3D等等) 优势 一致性: 在所有可以打开PDF的机...

steve_cui的博客 2万+

SpringBoot(九)jwt + 拦截器实现token验证

前面两篇文章的过滤器和拦截器,我们都提到过可以做诸如权限验证的事情。http/https是无状态的协议,当用户访问一个后端接口时,如何判断该用户有没有权限?当然,可以使用账号+密码去验证。但是,如果使用账号和密码,需要频繁访问数据库,很明显,会带来一些额外的开销。本篇介绍下使用jwt和拦截器实现token权限验证。

zhaojun的博客 1万+

Unity小游戏接入抖音敏感词检测

摘要: 本文介绍了Unity小游戏接入抖音敏感词检测的方法。抖音官方提供了两种API:SensitiveWordCheck用于检测敏感词,ReplaceSensitiveWords用于替换敏感词。此外,若使用键盘输入事件,可通过tt.onKeyboardComplete监听回调,平台会自动屏蔽敏感词(替换为*)。接入官方字库可有效避免审核驳回,适用于小游戏中的用户输入功能(如起名系统)。附官方文档链接及参数说明。

类人_猿的博客 4594

JWT登录认证(3拦截器)

使用拦截器统一验证令牌。登录和注册接口需要放行。:(在config配置项中配置拦截器):(注册一个拦截器)

m0_71088505的博客 567

【异常】安装hermes-agent时提示GnuTLS recv error (-110): The TLS connection was non-properly terminated.

Git克隆仓库时出现TLS连接异常报错的解决方案摘要: 当执行git clone命令时遇到"GnuTLS recv error (-110)"报错,通常由网络不稳定、缓冲区不足或证书验证问题导致。主要解决方案包括:1)增大Git HTTP缓冲区(git config --global http.postBuffer 524288000);2)使用GitHub镜像站加速克隆;3)临时禁用SSL验证进行测试;4)检查并调整代理配置;5)改用SSH协议克隆。建议优先尝试增大缓冲区和镜像站方案,

奶爸的编程之路,也就一周冷个三天 1350

【100%通过率】2023华为od机试C卷【电脑病毒感染】C语言 实现

一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t 表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1.

MISAYAONE的博客 1042

WebMvcConfigure使用

WebMvcConfigure

OneBaBa的专栏 674

【Claude Code】Extra inputs are not permitted 报错:代理网关剥离 Beta 标头的修复

通过代理或 LLM 网关连接 Anthropic API 时,Claude Code 报 "Extra inputs are not permitted"?根因是中间件删除了 anthropic-beta 请求标头,导致 Beta 字段被 API 拒绝。本文详解标头转发配置和 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS 回退方案。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 125

拦截器与 JWT 联合使用详解

JWT 是一个开放标准(RFC 7519),用于在各方之间以 JSON 对象的形式安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。JWT 结构:Header(头部):包含令牌类型(JWT)和签名算法(如 HS256、RS256)。Payload(负载):包含声明(claims),如用户 ID、用户名、过期时间等。Signature(签名):对前两部分进行签名,防止数据被篡改。典型场景:用户登录成功后,服务器生成一个 JWT 返回给客户端。客户端在后续请求的。

2503_92804185的博客 399

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Springboot集成JWT+Redis实现单点登录和同一账号只允许在一处登录

功能简述:JWT+Redis实现单点登录功能的同时,也实现同一个账号只能在一台设备上登录,实现方式并非是建立长连接,因为长连接是比较消耗系统性能的。这里只是简单的redis方式实现。 什么是单点登录? 单点登录的英文名叫做:Single Sign On(简称SSO)。 在最开始的单体架构(或者说单系统)当中,所有的代码都放在一个项目当中,传统的登录流程是 用户登录—>登录校验(校验用户名密码)—>将用户名等信息放入session当中—>成功登录。 这样就可以从session当中获取用.

weixin_43412919的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

使用Redis来实现JWT令牌主动失效机制

使用Redis来实现JWT令牌主动失效机制。

记得开心一点嘛的博客 983

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

手把手调试RuoYi登录流程:从Vue点击到Spring Security鉴权的完整链路追踪

本文通过Chrome开发者工具和IDEA断点,手把手追踪了RuoYi框架中从Vue前端点击登录到Spring Security后端鉴权的完整链路。详细解析了Vue3组件、Axios拦截器、Spring Security过滤器链及JWT令牌生成等10个关键环节的调试技巧,帮助开发者深入理解并快速排查企业级应用登录流程中的常见问题。

weixin_29018815的博客 179

使用Interceptor拦截器+jwt身份令牌完成用户登录和校验登录状态功能

【代码】使用Interceptor拦截器+jwt身份令牌完成用户登录和校验登录状态功能。

2401_84192804的博客 397

Springboot+Vue博客项目总结(1)

/3.如果不存在 登录失败//4.如果存在 使用jwt 生成token 返回给前端//5.toekn放入redis,设置过期时间。登录认证的时候先认证token字符串是否合法,在认证redsi认证是否合法/**根据account和password查询用户表@return*/@Override//需要id,account,头像avatar,naickname昵称。

2301_82244279的博客 432

拦截器与过滤器链机制

本文对比分析了Servlet Filter与Spring Interceptor的区别及协同工作流程。关键差异点包括:Filter基于Servlet规范作用于所有Web请求,Interceptor则是Spring MVC框架扩展层,仅处理控制器请求。两者在架构层次、依赖容器、执行顺序等方面存在显著不同。 执行流程上,Filter在Interceptor之前执行,形成双层拦截链:请求先经过Filter预处理,再进入Spring MVC的Interceptor链(preHandle→Controller→pos

qq_43414012的博客 1368

基于cookie的简单鉴权与JWT鉴权

1.基于cookie的简单登录校验 cookie鉴权在本文没有做token的加密,通过token/用户信息json键值对的方式存入redis,这样避免了session共享的问题,由于本文实现上省略了token加密,不能从cookie里解密拿到用户信息,再加上cookie有被伪造的风险,所以安全性较低. 有token加密的实现在本文JWT里有做 1.1 用户登录controler @Ap...

reee112的博客 1208

Shiro + JWT 登录认证授权

一、解释流程 大体流程: 用户使用username和secret登陆,将sercret通过MD5加密,通过username查询库中是否有该条记录,并比较加密后的密码是否相同,登陆成功后利用JWTutil生成带过期时间的token,以后发送请求时都需要在header中添加Authorization字段附加该token信息; 结合程序实现一个JWTutil,在其中实现利用登陆信息生成token,根据token获取username,token验证等方法; 实现一个JWTFilter继承BasicHtt

qq_43751336的博客 2179

uniapp小程序laravel+jwt权限认证完整系列

环境说明 uni-app laravel 5.7 + jwt-auth 1.0.0 权限认证整体说明 设计表结构 前端 request 类 有关权限认证的 js 封装 包含无感知刷新 token laravel auth 中间件 包含无感知刷新 token 获取手机号登陆 无痛刷新 access_token 思路 小程序如何判断登陆状态 设计表结构 和一般设计表没有什么区别,如果是多平台小程...

yt_php的博客 4500

SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证

JWT登录认证1 说明2 项目环境Maven依赖如下:配置如下:3 编写项目基础类编写JWT工具类编写暂无权限处理类编写用户未登录处理类编写登录失败处理类编写登录成功处理类编写登出成功处理类4 编写Security核心类编写自定义登录验证类编写自定义PermissionEvaluator注解验证编写SpringSecurity核心配置类编写JWT接口请求校验拦截器6 权限注解和hasPermiss...

u010152183的专栏 542

Java Token的原理和生成使用机制

1、什么是Cookie? cookie指的就是浏览器里面能永久存储数据的一种数据存储功能。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。 ...

Jbase的博客 3万+

scope 参数错误或没有 scope 权限_SpringBoot整合SpringSecurity示例实现前后分离权限注解+JWT登录认证...

前言SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更多安全控制方面的需求,但也相对它的学习成本会更高,两种框架各有利弊.实际开发中还是要根据业务和项目的需求来决定使用哪一种。JWT是在Web应用中安全传递信息的规范,从本质上来说是Token的演变,是一种生成...

weixin_39850365的博客 413
上一篇: springboot发送邮件
下一篇: spring boot验证码的实现
KBkongbaiKB
博客等级 码龄4年 1244粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值