首页 > 其他分享 >springboot如何做token的拦截校验

springboot如何做token的拦截校验

时间:2024-10-11 16:50:59浏览次数:7  
标签:return String 校验 springframework token import public springboot

1、新建一个拦截类

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtUtil jwtUtil;

    @Value("${oaTokenKeyword}")
    private String oaTokenKeyword;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String urlStr = request.getRequestURI();
        if(urlStr.endsWith("getToken")){
            return true;
        }
        String errorMessage;
        String token = request.getHeader("token");
        if(StringUtils.isEmpty(token)){
            errorMessage = "请求缺失token";
        }else{
            String validateTokenMessage = jwtUtil.validateToken(token,oaTokenKeyword);
            if(StringUtils.isEmpty(validateTokenMessage)){
                return true;
            }else{
                errorMessage = "身份验证失败!"+validateTokenMessage;
            }
        }
        // 返回无权限访问的消息
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401 Unauthorized
        // 设置响应内容类型及字符编码
        response.setContentType("text/plain; charset=UTF-8");
        response.getWriter().write(errorMessage);
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("2----------postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("3----------afterCompletion");
    }
}

  2、添加一个Web MVC 配置类

    注意:configure方法的http.cors().and().csrf().disable();是一定要有的,不会所有的请求,都是报401

@Configuration
@EnableWebSecurity
public class WebMvcConfiguration extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //1、拦截器注册
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                ;
    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.defaultContentType(MediaType.TEXT_PLAIN);
    }
}

  3、工具类JwtUtil

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Date;

@Component
public class JwtUtil {
    private final long EXPIRATION_TIME = 30 * 60 * 1000; // 30分钟

    @Value("${SECRET_KEY}")
    private String SECRET_KEY;

    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public Claims extractClaims(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }

    public String extractUsername(String token) {
        return extractClaims(token).getSubject();
    }

    public boolean isTokenExpired(String token) {
        return extractClaims(token).getExpiration().before(new Date());
    }

    public String validateToken(String token,String userName) {
        try{
            if(!extractUsername(token).equals(userName)){
                return "token无效!";
            }
            if(isTokenExpired(token)){
                return "token超时!";
            }
            return null;
        }catch (Exception e){
            e.printStackTrace();
            String message = e.getMessage();
            if(message.contains("Current time")){
                return "token超时!";
            }
            return "token无效!";
        }
    }
}

  

标签:return,String,校验,springframework,token,import,public,springboot
From: https://www.cnblogs.com/wwssgg/p/18458832

相关文章

  • java毕业设计-基于Springboot的多商家商城系统【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:Springboot数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能管理员管理:负责系统后台的整体运维,包......
  • 基于Springboot网上在线购物商城【附源码+文档】
    ......
  • 如何在springboot中,全局配置produces="text/plain;charset=UTF-8"
    为什么要使用produces="text/plain;charset=UTF-8"?当不用这个配置时,接口返回的数据,是有斜杠的 配置后,就正常了 以前我的配置方式,是在每个接口上,都添加上produces="text/plain;charset=UTF-8"。但是这样显示不太好,每个接口都加的话,会比较耗费时间如何做到全局配置使用W......
  • 基于java+springboot的社区心理健康服务平台系统小程序
    基于java+springboot的社区心理健康服务平台系统,旨在为社区居民提供全面的心理健康支持。后端运用springboot构建稳定可靠的服务,负责处理用户信息管理、心理咨询师资源整合、心理测评工具管理以及预约咨询安排等核心业务,与数据库有效交互以存储用户心理健康档案、咨询......
  • 基于java+springboot的社区汽车共享平台系统
    基于java+springboot的社区汽车共享平台系统,致力于为社区居民提供便捷的汽车共享服务。后端采用springboot构建,高效处理车辆信息管理、用户认证与授权、预订流程控制及费用结算等业务,与数据库紧密交互确保车辆状态、用户信息及预订记录准确存储与快速检索。前端利用相......
  • 基于SpringBoot+Vue的文学创作交流论坛系统设计与实现(源码+lw+部署+讲解)
    技术环境jdk版本:1.8及以上ide工具:Eclipse或者IDEA数据库:mysql5.7编程语言:Javajava框架:SpringBootmaven:3.6.1详细技术:HTML+CSS+JAVA+SpringBoot+MYSQL+VUE+MAVEN功能设计课题主要采用java技术和MySQL数据库技术以及springboot框架进行开发。系统主要包......
  • 基于SpringBoot+Vue的多媒体素材管理系统设计与实现(源码+lw+部署+讲解)
    技术环境jdk版本:1.8及以上ide工具:Eclipse或者IDEA数据库:mysql5.7编程语言:Javajava框架:SpringBootmaven:3.6.1详细技术:HTML+CSS+JAVA+SpringBoot+MYSQL+VUE+MAVEN功能设计该系统采用了java技术、SpringBoot框架,连接MySQL数据库,具有较高的信息传输速率与......
  • springboot企业招聘管理系统
    基于springboot+vue实现的企业招聘管理系统 (源码+L文+ppt)4-089   4.3系统结构设计  构图是系统的体系结构,体系结构是体系结构体系的重要组成部分。系统的总体结构设计如图4-2所示。   图4-2系统总体架构图4.4数据库设计  4.4.1数据库设计原则  ......
  • springboot酒店在线预订系统
    基于springboot+vue实现的酒店在线预订系统 (源码+L文+ppt)4-082                                   4.2 系统结构设计  构图是系统的体系结构,体系结构是体系结构体系的一部分,体系结构体系是体系结......
  • 【JAVA开源】基于Vue和SpringBoot卫生健康系统
    本文项目编号T076,文末自助获取源码\color{red}{T076,文末自助获取源码}......