zoukankan      html  css  js  c++  java
  • yb课堂之实战登陆模块开发整合Json Web Token《十》

    开发登陆模块功能,并整合Json Web Token

    开发登陆功能

    LoginRequest.java

    UserMapper.xml 

    UserMapper.java

    UserService.java

    UserServiceImpl.java

    package net.ybclass.online_ybclass.service.impl;
    
    import net.ybclass.online_ybclass.model.entity.User;
    import net.ybclass.online_ybclass.mapper.UserMapper;
    import net.ybclass.online_ybclass.service.UserService;
    import net.ybclass.online_ybclass.utils.CommonUtils;
    import net.ybclass.online_ybclass.utils.JWTUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import java.util.Date;
    import java.util.Map;
    import java.util.Random;
    
    @Service
    public class UserServiceImpl implements UserService {
        @Autowired(required = false)
        private UserMapper userMapper;
        @Override
        public int save(Map<String, String> userInfo) {
            User user=parseToUser(userInfo);
            if (user!=null){
                return userMapper.save(user);
            }else {
                return -1;
            }
        }
    
        /**
         * 解析map中的User对象
         * @param userInfo
         * @return
         */
        private User parseToUser(Map<String, String> userInfo) {
            if (userInfo.containsKey("phone")&&userInfo.containsKey("pwd")&&userInfo.containsKey("name")){
                User user =new User();
                user.setName(userInfo.get("name"));
                user.setHeadImg(getRandomImg());
                user.setPhone(userInfo.get("phone"));
                user.setCreateTime(new Date());
                String pwd=userInfo.get("pwd");
                //MD5加密
                user.setPwd(CommonUtils.MD5(pwd));
                return user;
            }
            return null;
        }
    
        /**
         * 放在CDN上的随机头像
         */
        private static final String [] headImg = {
                "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/12.jpeg",
                "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/11.jpeg",
                "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/13.jpeg",
                "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/14.jpeg",
                "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/15.jpeg"
        };
    
        /**
         * 获取随机头像
         * @return
         */
        private String getRandomImg(){
            int size=headImg.length;
            Random random=new Random();
            int index=random.nextInt(size);
            return  headImg[index];
        }
        @Override
        public User findByPhone(String phone) {
            return userMapper.findByPhone(phone);
        }
    
        @Override
        public String findByPhoneAndPwd(String phone, String pwd) {
            User user=userMapper.findByPhoneAndPwd(phone,CommonUtils.MD5(pwd));
            return user==null?null: JWTUtils.geneJsonWebToken(user);
        }
    }

    UserController.java

    CommonUtils.java

    JWTUtils.java

    package net.ybclass.online_ybclass.utils;
    
    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import net.ybclass.online_ybclass.model.entity.User;
    
    import java.util.Date;
    
    /**
     * JWT工具类
     * 注意点:
     * 1、生成的token,是可以通过base64进行解密出铭文信息
     * 2、base64进行解密出明文信息,修改再进行编码,则会解密失败
     * 3、无法作废已颁布的token,除非改密钥
     */
    public class JWTUtils {
        /**
         * 过期时间,一周
         */
        static final long EXPIRE = 60000 * 60 * 24 * 7;
        /**
         * 加密密钥
         */
        private static final String SECRET = "ybclass.net168";
        /**
         * 令牌前缀
         */
        private static final String TOKEN_PREFIX = "ybclass";
        /**
         * 主题
         */
        private static final String SUBJECT = "ybclass";
    
        /**
         * 根据用户信息,生成令牌
         *
         * @param user
         * @return
         */
        public static String geneJsonWebToken(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;
            }
        }
    }

    项目结构

    修改domain为model层

    • 增加entity、request包
    • 记得改appliccation.properties配置文件路径

    演示

  • 相关阅读:
    jQuery源码dom ready分析
    jQuery的deferred对象详解(二)
    jQuery的deferred对象详解(一)
    javascript线程解释(setTimeout,setInterval你不知道的事)---转载
    前端工程精粹(二):静态资源管理与模板框架
    拒绝了对对象 'sp_sdidebug'(数据库 'master',所有者 'dbo')的 EXECUTE 权限。
    Page.User.Identity.Name获取不到结果
    水晶报表(web)表格信息展示
    Office导入导出组件权限配置汇总
    CSS hack样式兼容模式收藏
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/13324566.html
Copyright © 2011-2022 走看看