一.登入功能使用到的技术
1.会话技术(JWT令牌技术)
就是登入成功后会颁发一个令牌给前端,前端每次访问都会携带这个令牌
2.统一拦截技术(拦截器技术Interceptor)
这个意思就是用拦截器来拦截前端发起的请求,用户携带令牌就是让他过去,如果没有或者失效就会重新登录。
相关更细节知识点大家可以继续查相关资料
二.jwt相关代码的实现
1.这个是jwt的工具包可以直接使用
public class JwtUtils { private static String signKey = "NewSecretKey"; private static Long expire = 43200000L; /** * 生成JWT令牌 */ public static String generateJwt(Map<String, Object> claims){ String jwt = Jwts.builder() .addClaims(claims) //有效载荷 .signWith(SignatureAlgorithm.HS256, signKey)//签名算法 .setExpiration(new Date(System.currentTimeMillis() + expire))//过期时间 .compact(); return jwt; } /** *解析Jwt令牌 */ public static Claims parseJwt(String jwt){ Claims claims = Jwts.parser() .setSigningKey(signKey)//指定签名密钥 .parseClaimsJws(jwt)//指定令牌Token .getBody(); return claims; }
2.controller层来调用这个jwt的工具包
到这里基本的登入功能实现完成,但每次请求都需要把它拦截下来。
三.统一拦截技术
下面代码是拦截代码
@Component @Slf4j public class LoginCheckInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //1.获取请求URL String url = request.getRequestURL().toString(); log.info("得到请求路径:{}",url); //2.判断url是否包含login,有则放行 if(url.contains("/login")){ return true; } //3.获取请求头中的令牌 String token = request.getHeader("token"); log.info("从请求头中获取token:{}",token); //4.判断令牌是否存在,如果不存在,返回错误结果(未登录) if(!StringUtils.hasLength(token)){ log.info("Token不存在"); //创建响应结果对象 Result responseResult = Result.error("NOT_LOGIN"); //把result对象转为json字符串 String json = JSONObject.toJSONString(responseResult); //设置响应头(告知浏览器:响应的数据类型为json、响应的数据编码表为utf-8) response.setContentType("application/json; charset=utf-8"); //响应 response.getWriter().write(json); return false; } //5.解析token,如果解析失败,返回错误结果(未登录) try { JwtUtils.parseJwt(token); } catch (Exception e) { log.info("令牌解析失败!"); //创建响应结果 Result responseResult = Result.error("NOT_LOGIN"); //把result转化为json String json = JSONObject.toJSONString(responseResult); response.setContentType("application/json; charset=utf-8"); //响应 response.getWriter().write(json); return false; } return true; } }
下面是拦截什么路径