开发登陆模块功能,并整合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配置文件路径

演示

yb课堂之实战登陆模块开发整合Json Web Token《十》的更多相关文章

  1. Go实战--golang中使用JWT(JSON Web Token)

    http://blog.csdn.net/wangshubo1989/article/details/74529333 之前写过关于golang中如何使用cookie的博客: 实战–go中使用cook ...

  2. JSON WEB TOKEN 从原理到实战

    阅读本文大概需要 4.2 分钟. 作者:王廷骏原文:https://juejin.im/post/5ce272c1e51d45109b01b0f8 1. JSON WEB TOKEN 1.1 什么是J ...

  3. JSON Web Token (JWT)生成Token及解密实战。

    昨天讲解了JWT的介绍.应用场景.优点及注意事项等,今天来个JWT具体的使用实践吧. 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用,网址如下. https://githu ...

  4. SpringSecurity权限管理系统实战—六、SpringSecurity整合jwt

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  5. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-8.用户模块开发之保存微信用户信息

    笔记 8.用户模块开发之保存微信用户信息     简介:开发User数据访问层,保存微信用户信息 问题:             微信回调 用户昵称乱码             解决:        ...

  6. Maven02——回顾、整合ssh框架、分模块开发、私服

    1 回顾 1.1 Maven的好处 节省空间 对jar包做了统一管理 依赖管理 一键构建 可跨平台 应用在大型项目可提高开发效率 1.2 Maven安装部署配置 1.3 Maven的仓库 本地仓库 远 ...

  7. springboot多模块开发以及整合dubbo\zookeeper进行服务管理

    之前研究了springboot单工程的使用,参考git地址:https://github.com/qiao-zhi/springboot-ssm 下面研究springboot多模块开发的过程. 1.模 ...

  8. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

  9. C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇)

    C语言-apache mod(模块开发)-采用apxs开发实战(centos7.2 linux篇) 名词解释:apxs apxs is a tool for building and installi ...

  10. C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)

    C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇) 名词解释:apxs apxs is a tool for building and installing ext ...

随机推荐

  1. 在tomcat上安装PFX格式证书部署https

    您可以在Tomcat服务器安装已签发的SSL证书,实现通过HTTPS安全访问Web服务.本文介绍如何在Tomcat服务器安装PFX格式的SSL证书. 步骤一:在阿里云的域名管理后台,下载SSL证书 登 ...

  2. AIRIOT答疑第3期|如何使用物联网平台的可视化组态引擎?

    丰富组件,满足千人千面! AIRIOT物联网低代码平台的可视化组态引擎,具备丰富的可视化看板及组件,满足各类工艺流程图.数据可视化需求.支持三维编辑.图形绘制.图表设计等设计方式,PPT模式设计软件界 ...

  3. 鸿蒙HarmonyOS实战-Stage模型(AbilityStage组件容器)

    前言 组件容器是一种用于管理和组织组件的工具或环境.它可以提供一些基本的功能,如组件的注册.创建.销毁和查找.组件容器通常会维护一个组件的依赖关系,并负责将这些依赖注入到组件中.它还可以提供一些其他的 ...

  4. XML Schema 字符串数据类型及约束详解

    字符串数据类型用于包含字符字符串的值.字符串数据类型可以包含字符.换行符.回车符和制表符. 以下是模式中字符串声明的示例: <xs:element name="customer&quo ...

  5. linux内核参数调优和Linux实例常用内核网络参数介绍与常见问题处理

    问题1 并发场景下,常常会出现一个进程最大文件句柄数不足的情况,会报如下错误: 24: Too many open files 解决办法 ulimit -a S:表示软限制,超出设定的值会告警. H ...

  6. Android 12(S) MultiMedia Learning(九)MediaCodec

    这一节来学习MediaCodec的工作原理,相关代码路径: http://aospxref.com/android-12.0.0_r3/xref/frameworks/av/media/libstag ...

  7. 【已解决】docker overlay2占用大量磁盘空间处理方法

    在使用docker容器的时候遇到了容量上的问题,做一个记录 处理方式1:在使用docker时,往往会出现磁盘空间不足,导致该问题的通常原因是因为docker中部署的系统输出了大量的日志内容. 此时,可 ...

  8. Linux内核Kernel启动过程

    在上一篇计算机启动过程文章中介绍了计算机启动的基本流程,本篇文章主要介绍Linux内核Kernel的启动过程. 一.内核启动的基本流程 sequenceDiagram participant Boot ...

  9. swift_slowAlloc Crash 分析

    一.Crash详情 Crash类型 exception EXC_BREAKPOINT (SIGTRAP) reason EXC_BREAKPOINT EXC_ARM_BREAKPOINT fault_ ...

  10. 7.12考试总结(NOIP模拟12)[简单的区间·简单的玄学·简单的填数]

    即使想放弃,也没法放弃最想要的东西,这就是人 前言 这次应该是和 SDFZ 一起打的第一场比赛吧. 然而我还是 FW 一个... 这次考试也有不少遗憾,主要的问题是码力不足,不敢去直面正解,思考程度不 ...