代码编织梦想

  <!-- 生成token-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.9.0</version>
        </dependency>

工具类


import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.HttpRequestHandler;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

@Slf4j
@Component
public class TokenUtils {

    @Autowired
    private static HttpServletRequest httpServletRequest;
    //密钥
    public static final String SECRET = "ShanXiSiKaoZheTongChengDaoJia";
    //过期时间:秒
    public static final int EXPIRE = 300;

    /**
     * 生成Token
     */
    public static String getToken(String userId,String SECRET){
//        //过期时间
//        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        return JWT.create().withAudience(userId) // 将 user id 保存到 token 里面 作为载荷
//                .withExpiresAt(DateUtil.offsetHour(new Date(),1)) //两小时后token过期
                .withExpiresAt(DateUtil.offsetSecond(new Date(),300)) //两小时后token过期
                .sign(Algorithm.HMAC256(SECRET)); // 以 sign 作为 token 的密钥

    }
    /**
     * 验证token
     */
    public static DecodedJWT verify(String token) {
        //如果有任何验证异常,此处都会抛出异常
        DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
        return decodedJWT;
    }

    /**
     * 获取token中的 payload
     */
    public static DecodedJWT getTokenInfo(String token) {
        DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
//     使用 TokenUtils.getTokenInfo(token).getClaim("account").asString()
        return decodedJWT;
    }



}

在用户登录系统的时候生成token并放到redis 将token和用户信息返回给前端

 //生成token
        String token = TokenUtils.getToken(User.getTel(), TokenUtils.SECRET);
        redisTemplate.opsForValue().set("token"+User.getTel(), token);
        redisTemplate.expire("token"+User.getTel(),300,TimeUnit.MINUTES);

前端在后面的操作将token设置为Header

下面是请求过滤器的请求拦截 以及token的验证 并实现一个账号只能有一个人登录




import com.alibaba.fastjson.JSONObject;

import com.sxskz.chaoliu.pojo.R;
import com.sxskz.chaoliu.util.ValidateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.TimeUnit;
/*
* 过滤器
* */
@WebFilter(urlPatterns = {"/api/*"})  ///api/*
public class LoginFilter implements Filter {

    @Autowired
    RedisTemplate redisTemplate;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException{

    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("项目启动了-----");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        response.setHeader("Access-Control-Allow-Origin", "*"); //解决跨域访问报错
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600"); //设置过期时间
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With,Content-Type, Accept,token,tel,client_id,identify, uuid, Authorization");
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // 支持HTTP 1.1.
        response.setHeader("Pragma", "no-cache"); // 支持HTTP 1.0. response.setHeader("Expires", "0");
        response.setHeader("Access-Control-Expose-Headers","X-forwared-port, X-forwarded-host");
        response.setHeader("Vary","Origin,Access-Control-Request-Method,Access-Control-Request-Headers");
        //需要放行的端口
        String path = "/api/login" +
                     "/api/insertUser" +
                     "/api/getCode" +
                    "api/getYcCode"+
                     "/api/notify" +
                    "/order/hrefBack"+
                    "/api/callback"+
                    "/api/upLoadHeader" +
                    "/api/htUserLogin"+
                    "/api/selectProducts" +
                    "/api/selectBlindBoxAll";
        String token = request.getHeader("token");
        System.out.println(">>>>>>>>>>>>>>"+token);
        String tel = request.getHeader("tel");
        String uri = request.getRequestURI();

        if (path.contains(uri)) {
            filterChain.doFilter(servletRequest,servletResponse); // 放行请求
        }else if (ValidateUtil.isEmpty(token) || ValidateUtil.isEmpty(tel)){
            String s = JSONObject.toJSONString(new R("100", null, "请先登录"));
            response.setContentType("json/text;charset=utf-8");
            PrintWriter printWriter = response.getWriter();
            printWriter.write(s);
        }else {
            Long expire = redisTemplate.getExpire("token" + tel);
            if (expire <= 0){
                String s = JSONObject.toJSONString(new R("300", null, "token过期,请重新登录"));
                response.setContentType("json/text;charset=utf-8");
                PrintWriter printWriter = response.getWriter();
                printWriter.write(s);
            }else {

                String oneToken = (String) redisTemplate.opsForValue().get("token" + tel);
                if (!token.equals(oneToken)){
                    System.out.println("66666666666666666666666666666666666666");
                    String s = JSONObject.toJSONString(new R("200", null, "该账号已在其他设备登录,请重新登录或修改密码"));
                    response.setContentType("json/text;charset=utf-8");
                    PrintWriter printWriter = response.getWriter();
                    printWriter.write(s);
                }else{
                    redisTemplate.expire("token"+tel,60L, TimeUnit.MINUTES);
                    filterChain.doFilter(servletRequest,servletResponse);
                }

            }
        }
     }

    @Override
    public void destroy() {

    }
}

切记这个过滤器操作要在启动类上添加注解@ServletComponentScan //配合过滤器否则不生效

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40951656/article/details/127997206

nodejs实战之 jwt生成token以及 验证_渔倒到的博客-爱代码爱编程_nodejs设置token

流程: 用户登录 在中间层node端 生成token,前端接收token,存放在本地,之后请求放在header带到后端。后端验证token是否正确。 1.首先引入依赖包: const jwt = require(‘

SMM+shiro集成jwt 生成token 实现与vue验证登录-爱代码爱编程

之前的后台由smm+shiro搭建,最近想要pc端实现前后端分离,但移动端和管理端这些公用一个,想要实现前后端分离,而且不影响管理端的操作,管理端是由session存储用户信息,之前的pc端也是,通过shiro实现登录授权认证,现在pc端实现前后分离,这样的话前后交互不安全,同时存在跨域的问题,因此,想实现pc端前后分离,不影响 管理端,所以pc端采用jw

SpringBoot 集成JWT实现token登录(生成token和解token)-爱代码爱编程

前言: 各位同学大家好,有段时间没有给大家更新文章了,具体多久我也不记得,最近有在用 springboot 写了一个本地的服务。因为客户端需要做到自动登录 需要生成token 所以需要学习了springboot中如何实现 那么废话不多说,我们正式开始 准备工作 1安装好idea 或者eclispe +sts开发环境 2安装maven 并配置环境 怎么

javaApi JWT token生成以及验证-爱代码爱编程

JWT简介 JSON Web token简称JWT, 是用于对应用程序上的用户进行身份验证的标记。也就是说, 使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性, 同时保证应用程序的安全。 在身份验证过程中, 当用户使用其凭据成功登录时, 将返回 JSON Web token, 并且必须在本地

jwt生成token和解密token-爱代码爱编程

目录 一、引入依赖二、工具类三、测试 一、引入依赖 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId>

使用JWT生成Token,并实现Token刷新API-爱代码爱编程

一、背景 传统的网站用户认证方式严重依赖于 Cookie 。但 很多 项目是一个前后端分离的项目,我们希望前端界面的实现不受 项目API 的影响,这就要求 用户认证没有 Cookie 时也能进行。其实仔细想想,用户的认证鉴权,无非就是在访问 API 时发送一个能够识别出用户的字符串给服务端,然后服务端基于字符串查找出用户,再判断用户是否有权限使用 API

使用JWT生成token实现权限验证-爱代码爱编程

流程         点击登录按钮,后端验证账号密码是否通过,如果通过则生成token,把token发送给前端,前端保存到cookie(前后端分离是不能使用保存session,因为每次发送ajax请求响应后都会断开服务器,就会导致session生命周期就销毁掉,然后再发送请求时再重新连接服务器,session已经不存在了),之后访问受限资源就需要取coo

Java实现Token登录验证(基于JWT的token认证实现)-爱代码爱编程

文章目录 一、JWT是什么?二、使用步骤1.项目结构2.相关依赖3.数据库4.相关代码三、测试结果 一、JWT是什么? 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程: 1、客户端使用用户名和密码请求登录 2、服务端收到请求,验证用户名和密码 3、验证成功后,服务端会签发一个token,再把这个token返回给客