第一步 先导入依赖 需要 redis 和 jwt 的依赖 还有JwtUtils的工具类
<!--jwt依赖--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>
package com.wx.utils; import cn.hutool.json.JSONUtil; import com.alibaba.druid.util.StringUtils; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jws; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.util.Date; @Component public class JwtUtils { /** * 秘钥 */ public static final String SECRET = "zjKkye4PN59B2wriTjtVCo3BOYoD1B"; /** * 过期时间24小时 */ public static final long EXPIRE = 1000 * 60 * 60 * 24; @Autowired private HttpServletRequest request; /** * 通过payload创建令牌 * * @param payload 令牌里携带的信息 * @return token令牌 */ public String createToken(Object payload) { String jwtToken = Jwts.builder() .setHeaderParam("typ", "JWT")// 类型 .setHeaderParam("alg", "HS256") // 算法名 .setIssuedAt(new Date()) // 签发时间 .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))// 过期时间 .claim("payload", JSONUtil.toJsonStr(payload)) .signWith(SignatureAlgorithm.HS256, SECRET) .compact(); return jwtToken; } /** * 效验token * * @param jwtToken * @return */ public boolean validToken(String jwtToken) { if (StringUtils.isEmpty(jwtToken)) { return false; } try { Jwts.parser().setSigningKey(SECRET).parseClaimsJws(jwtToken); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 解析token * * @param headerName * @return */ public <T> T parseToken(String headerName, Class<T> clazz) { String token = request.getHeader(headerName); if (StringUtils.isEmpty(token)) { return null; } try { Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token); Claims claims = claimsJws.getBody(); Object payload = claims.get("payload"); return JSONUtil.toBean(JSONUtil.parseObj(payload), clazz); } catch (Exception e) { return null; } } }
第二步 创建 数据库 简简单单 的登录 工作流 需要价格type 类型
第三步去controller 类里编写代码 使用map写的登录
@RequestMapping("login") public Map<String , Object> login(@RequestBody User user){ Map<String ,Object> map=new HashMap<>(); QueryWrapper<User> queryWrapper=new QueryWrapper<>(); queryWrapper.eq("name",user.getName()); User loginUser = userService.getOne(queryWrapper); if(loginUser==null){ map.put("state",-1); map.put("msg","用户名不正确"); return map; } if(!loginUser.getPwd().equals(user.getPwd())){ map.put("state",-1); map.put("msg","密码不正确"); return map; } String token = jwtUtils.createToken(loginUser); redisTemplate.opsForValue().setIfAbsent("token",token); map.put("state",0); map.put("msg","登录成功"); map.put("token",token); map.put("user",loginUser); return map; }
第四步 去前端调用接口 即可
<template> <div> <el-form :model="formInline" class="demo-form-inline"> <el-form-item label="用户名"> <el-input v-model="formInline.name" placeholder="用户名"></el-input> </el-form-item> <el-form-item label="密码"> <el-input type="password" v-model="formInline.pwd" placeholder="密码"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="onSubmit">登录</el-button> </el-form-item> </el-form> </div> </template> <script> export default { name: "LoginView", data(){ return { formInline:{} } },methods:{ onSubmit(){ this.axios.post("http://localhost:8083/user/login",this.formInline).then(res=>{ if(res.data.state==0){ this.$message.success(res.data.msg) sessionStorage.setItem("token",res.data.token) sessionStorage.setItem("user",JSON.stringify(res.data.user)) console.log(res.data.user) this.$router.push("/list") }else{ this.$message.error(res.data.msg) } }) } },created() { } } </script> <style scoped> </style>