[开发工具]-[Token&JWT]

Token&JWT

token

前端请求后端时,后端需要保证这个请求来自受认可的用户,因此需要对用户进行认证。为避免频繁地使用与数据库交互以获取用户信息的手段来认证,在初次登陆后,后端为前端生成一个信息,前端在之后向后端发出请求时只需携带这个信息,后端通过判断该信息的合法性来判断是否允许该请求,以及认证用户,这个信息就是token
所以token并没有固定的实现方式,作为一种认证作用的工具,根据实际需求不同或开发者的习惯可以有不同的实现方式,只要能实现类似的认证作用即可

关于token的刷新机制

机制1:设置一个过期时间expire_time以及刷新时间refresh_time,刷新时间大于过期时间,当当前token存活时间达到过期时间时,可以凭借这个token去获得一个新的token;但如果存活时间大于刷新时间,就只能重新登陆来获取新的token。相当于就是,用户端拿着一个token,如果发出请求的频率较高(两次请求之间相隔不超过expire_time),那就没必要刷新token,一方面会影响到用户体验,一方面服务端这边也需要进行额外的生成token操作;而如果用户长时间没有发出新的请求,超出了refresh_time,那么对用户的信任就应降低,有必要刷新token

JWT

概述

JWT(json web token),是其中一种实现的规范,由三个部分组成:headerpayloadsignature。header包含token的基本的通用信息,如加密所用算法,过期时间等;payload中可以携带如用户信息等其它的信息,例如可以把用户的账号密码作为payload的一部分;signature是对header,payload以及后端设定的盐值进行加密后组成的签证信息

代码示例

依赖
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.18.1</version>
</dependency>
JWT工具类
public class JwtUtil {
	/**
	 * 自定义签名(盐值)
     */
    private static final String SIGNATURE = "!Q@W#E$R";
    /**
     *生成token
     * @param map 要放入payload的键值对数据
     * @return java.lang.String
     */
    public static String generateToken(Map<String,String> map){
        Calendar calendar = Calendar.getInstance();
        //设置15天为token过期时间
        calendar.add(Calendar.DATE,15);
        //创建builder
        JWTCreator.Builder builder = JWT.create();
        //将map中的键值对放入token的payload处
        map.forEach(builder::withClaim);
        //设置过期时间以及加密算法和签名
        return builder.withExpiresAt(calendar.getTime())
        		//使用的加密算法一般都是这一个
                .sign(Algorithm.HMAC256(SIGNATURE));
    }
    /**
     *验证token,只要验证过程中有一步不通过该方法都会抛异常,因此不用过多处理
     * @param token 前端请求携带的token
     * @return com.auth0.jwt.interfaces.DecodedJWT
     */
    public static DecodedJWT verify(String token){
        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }
}
整合拦截器
@Slf4j
public class JwtInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //从请求头获取token
        String token = request.getHeader("token");
        ..............
        try {
            JwtUtil.verify(token);
            return true;
        }catch (SignatureVerificationException e){
            log.error("token所使用的签名无效,[{}]",e.getMessage());
            resultDto.put("msg","token所使用的签名无效");
        }catch (TokenExpiredException e){
            log.error("token已过期,[{}]",e.getMessage());
            resultDto.put("msg","token已过期");
        }catch (AlgorithmMismatchException e){
            log.error("token所使用的算法不一致,[{}]",e.getMessage());
            resultDto.put("msg","token所使用的算法不一致");
        }catch (Exception e){
            log.error("无效token![{}]",e.getMessage());
            resultDto.put("msg","token无效");
        }
        response.getWriter().println(new ObjectMapper().writeValueAsString(....));
        return false;
    }
}
springMVC配置类
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	//在拦截器注册类中注册自定义的拦截器,以及要拦截的请求路径
        registry.addInterceptor(new JwtInterceptor())
                .addPathPatterns("/**");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Session、Cookie、TokenJWT都是在Web开发中用于管理用户身份认证和会话管理的工具。 1. Session:Session指的是服务器端保存的用户信息。当用户登录成功后,服务器会创建一个session,为该用户分配一个session ID,并将该ID保存到cookie中,发送给客户端。客户端浏览器保存了这个cookie,以后每次请求都会带上这个cookie,服务器通过这个cookie就可以识别出用户身份,从而进行相应的操作。Session机制存在一定的风险,比如会话劫持、会话固定等问题,需要注意安全性。 2. Cookie:Cookie是一种客户端保存用户信息的机制,它是由服务器在响应HTTP请求时通过Set-Cookie头部字段发给客户端浏览器的一小段文本信息。浏览器将这些信息保存在客户端,以后每次向服务器发送请求时都会自动带上这些cookie,从而实现身份认证和会话管理。但是Cookie也存在一些安全问题,比如会话劫持、跨站脚本攻击等问题。 3. TokenToken是一种用户身份认证和授权的机制,通常由服务器生成,以便在客户端和服务端之间进行身份认证和授权。客户端在登录成功后,服务器会为该用户生成一个Token,并将Token发送给客户端浏览器。客户端在之后的请求中需要携带该Token,服务器验证Token的有效性后,就可以识别出用户身份,并进行相应的操作。Token相比Session和Cookie,具有更高的安全性和可扩展性。 4. JWTJWT是一种基于Token的身份认证和授权机制。JWT包含三部分,分别是头部、载荷和签名。头部包含加密算法和类型等信息;载荷包含用户的身份信息和相关的元数据等信息;签名则是对头部和载荷进行签名生成的一段密文,用于验证Token的有效性。JWT具有无状态、可扩展、跨域等特点,被广泛用于Web开发中的用户身份认证和授权。 ### 回答2: Session、Cookie、TokenJWT都是常见的身份验证和会话管理方法。下面我会分别介绍它们。 Session:Session是服务器端记录用户状态的一种机制。当用户通过用户名和密码登录后,服务器会为该用户创建一个唯一的Session。之后,用户再发送请求时,服务器会根据Session来识别用户并获取用户的状态信息。 Cookie:Cookie是一种在客户端存储的小型文本文件。在用户通过用户名和密码登录成功后,服务器可以将一个包含Session信息的Cookie发送给客户端,客户端会将该Cookie保存下来。之后,客户端发送请求时,会自动附带上该Cookie,用于向服务器证明用户的身份。 TokenToken是一种代表用户身份的令牌。与Cookie不同,Token是在客户端保存的,并且不需要服务器端存储用户状态。当用户登录成功后,服务器会生成一个Token并发送给客户端,客户端将其保存起来。之后,客户端发送请求时,会将Token作为请求头信息的一部分发送给服务器,服务器根据Token验证用户身份。 JWTJWT(JSON Web Token)是一种基于JSON的开放标准,用于在各方之间安全传输信息。它由三部分组成:Header、Payload和Signature。其中,Header用于描述JWT的元数据,Payload用于存储实际传输的数据,Signature用于验证JWT的合法性。在使用JWT进行身份验证时,服务器会生成一个JWT并发送给客户端,客户端将其保存起来。之后,客户端发送请求时,会将JWT作为请求头信息的一部分发送给服务器,服务器根据JWT验证用户身份的合法性。 总结:Session、Cookie、TokenJWT都是常用于身份验证和会话管理的方法,它们各有优劣和适用场景。Session和Cookie依赖于服务器端存储用户状态,而TokenJWT则可以减轻服务器的负担,并且适用于分布式系统。其中,JWT由于其自包含性和可扩展性,在分布式系统和前后端分离的架构中得到了广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值