本篇博文注重功能需求的实现,概念性的东西不多,所以想要多了解更全面的JWT 或者想要了解单点登录的实现原理及其他,可以移步其他博文.这里博主自己随便看了俩篇博文
JWT
单点登录
需求设计思路
用户登录,前端–>后端 传数据(id,name,password等等),存入数据库的password可能会被加密,因此前端传来的password也要加密.
在数据库中select,存在 即 在后端生成token 返回前端,不存在则response 用户或密码错误
Header 头部
PayLoad 负载:
存放有效的信息
标注声明
公共声明
私有声明
Signature 签证:
idea + maven + postman(前端测试)
SpringBoot + Maven
jar包
<!-- 跨域身份验证解决⽅案 Json web token包--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0</version> </dependency>
传值:User(用户信息)
import com.maoni.maoni_xdclass.model.entity.User; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; /** * Jwt工具类 * 注意点: * 1、生成的token, 是可以通过base64进行解密出明文信息 * 2、base64进行解密出明文信息,修改再进行编码,则会解密失败 * 3、无法作废已颁布的token,除非改秘钥 */ public class JWTUtils { /** * 过期时间,一周 */ private static final long EXPIRE = 60000 * 60 * 24 * 7; /** * 加密秘钥,自定义的字符串 */ private static final String SECRET = "*******"; /** * 令牌前缀,自定义的字符串 */ private static final String TOKEN_PREFIX = ""*******";"; /** * 面响主体,自定义的字符串 */ private static final String SUBJECT = ""*******";"; /** * 根据用户信息,生成令牌 token * @param user * @return */ public static String genJsonWebToken(User user){ String token = Jwts.builder().setSubject(SUBJECT) .claim("head_img",user.getHeadImg()) .claim("id",user.getId()) .claim("name",user.getName()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) .signWith(SignatureAlgorithm.HS256,SECRET).compact(); token = TOKEN_PREFIX + token; return token; } /** * 校验token的方法 * @param token * @return */ public static Claims checkJWT(String token){ try{ final Claims claims = Jwts.parser().setSigningKey(SECRET) .parseClaimsJws(token.replace(TOKEN_PREFIX,"")).getBody(); return claims; }catch (Exception e){ return null; } } }
/** * 注册 * @param root * @param pwd * @return */ String login(String root, String pwd);
/** * 登录 * @param phone * @param pwd * @return */ @Override public String login(String phone, String pwd) { //根据前端传过来的用户值查询表返回密码值 User user= userMapper.login(phone,CommonUtils.MD5(pwd)); if (user != null){ //生成token令牌发给前端保存 String token = JWTUtils.genJsonWebToken(user); return token; }else { return null; } }
/** * 用户登录接口开发 * @param loginRequest * @return */ @RequestMapping("login") public JsonData login(@RequestBody LoginRequest loginRequest){ //登录验证,验证成功生成token返回 String token = userService.login(loginRequest.getPhone(),loginRequest.getPwd()); return token ==null?JsonData.buildError("账号或密码错误,请重新登录"):JsonData.buildSuccess(token); }
/** * 查询用户信息 * @param userId * @return */ User findByUserId(Integer userId);
/** * 根据前端传token,获取个人id,查询个人信息 * @param userId * @return */ @Override public User findByUserId(Integer userId) { return userMapper.findByUserId(userId); }
/** * 根据前端传token,获取个人id,查询个人信息 */ @RequestMapping("find_by_token") public JsonData findByUserToken(HttpServletRequest request){ Integer userId = (Integer)request.getAttribute("user_id"); if(userId ==null){ return JsonData.buildError("查询失败"); } User user =userService.findByUserId(userId); return JsonData.buildSuccess(user); }
提示: 思考中的东西涉及拦截器的概念,所有的未被放行的请求都是经过拦截器的.在请求发送给服务端后,拦截器做出拦截,将数据处理,解析生成controller层需要的数据.所以在这里拦截器就已经把token进行解密,将用户id或者用户信息放进request中…
后面可能再写一篇关于拦截器的实现功能…看起来比较简单,因为博主是个菜鸟,所以博文凑合看吧,若有写的不对的地方,敬请指出.谢谢