![](https://img-blog.csdnimg.cn/img_convert/d0b7ba20e37b394bd09612213818b03a.png)
![](https://img-blog.csdnimg.cn/img_convert/9c63b4f6eef505297ecd1bb783e24a2f.png)
![](https://img-blog.csdnimg.cn/img_convert/4344418b7ff1b8fc3d05d74c85ccacca.png)
![](https://img-blog.csdnimg.cn/img_convert/db38cecf71d49dc2961a13200f4f7cf0.png)
![](https://img-blog.csdnimg.cn/img_convert/4ef781236f56d8c521a0ed507e8ee299.png)
![](https://img-blog.csdnimg.cn/img_convert/e00c0f187093cfe3fb21f9033c598b7c.png)
![](https://img-blog.csdnimg.cn/img_convert/4f143711df885190869d5e3c5406053e.png)
一、整合使用JWT
![](https://img-blog.csdnimg.cn/img_convert/eff1d881871959eee3643799ed41456f.png)
![](https://img-blog.csdnimg.cn/img_convert/93d63093737cf0acd6bc1a9e0c678102.png)
package com.atguigu.commonutils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
* @author helen
* @since 2019/10/16
*/
public class JwtUtils {
public static final long EXPIRE = 1000 * 60 * 60 * 24;
public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";
public static String getJwtToken(String id, String nickname){
String JwtToken = Jwts.builder()
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")
.setSubject("guli-user")
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
.claim("id", id)
.claim("nickname", nickname)
.signWith(SignatureAlgorithm.HS256, APP_SECRET)
.compact();
return JwtToken;
}
/**
* 判断token是否存在与有效
* @param jwtToken
* @return
*/
public static boolean checkToken(String jwtToken) {
if(StringUtils.isEmpty(jwtToken)) return false;
try {
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 判断token是否存在与有效
* @param request
* @return
*/
public static boolean checkToken(HttpServletRequest request) {
try {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return false;
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 根据token获取会员id
* @param request
* @return
*/
public static String getMemberIdByJwtToken(HttpServletRequest request) {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return "";
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
Claims claims = claimsJws.getBody();
return (String)claims.get("id");
}
}
二、整合QQ邮箱
![](https://img-blog.csdnimg.cn/img_convert/462a4a1b7b310f0ec0cf01f033deda76.png)
![](https://img-blog.csdnimg.cn/img_convert/a5c48c6ed1e3c29c9cc20eada4ebfafe.png)
@Api(description="短信验证管理") //swagger提示注解定义在类上:@Api
@RequestMapping("edumsm/msm")
@RestController
@CrossOrigin
public class MsmController {
@Autowired
private MsmService msmService;
@Autowired
private JavaMailSender javaMailSender;
@GetMapping("send/{dstEmail}")
public R senderMail(@PathVariable String dstEmail) {
SimpleMailMessage message = new SimpleMailMessage();
// 发件人 你的邮箱
message.setFrom("494295659@qq.com");
// 接收人 接收者邮箱
message.setTo(dstEmail);
//邮件标题
message.setSubject("谷粒学院注册用户验证码");
String code = RandomUtil.getSixBitRandom();
//邮件内容
message.setText("您好,您正在注册谷粒学院账号,本次的验证码为:\n"+code+"\n"+"有效时间是5分钟,如非本人操作,请忽略此邮件!");
try{
javaMailSender.send(message);
System.out.println("QQ邮箱验证码 "+code);
return R.ok().data("code",code);
}catch (Exception e){
e.printStackTrace();
return R.error().message("请检查您的QQ邮箱是否正确");
}
}
}
使用redis设置验证码的有效时间
package com.atguigu.msmservice.controller;
import com.atguigu.commonutils.R;
import com.atguigu.msmservice.service.MsmService;
import com.atguigu.msmservice.utils.RandomUtil;
import io.swagger.annotations.Api;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.*;
import java.util.concurrent.TimeUnit;
@Api(description="短信验证管理") //swagger提示注解定义在类上:@Api
@RequestMapping("edumsm/msm")
@RestController
@CrossOrigin
public class MsmController {
@Autowired
private MsmService msmService;
@Autowired
private JavaMailSender javaMailSender;
@Autowired //redis是以key val存储的泛型设置为map
private RedisTemplate<String,String> redisTemplate;
@GetMapping("send/{dstEmail}")
public R senderMail(@PathVariable String dstEmail) {
//当用户注册时发送过验证码了,先去redis中根据验证码的 key 查这个验证码是否存在
String code = redisTemplate.opsForValue().get(dstEmail);
//把qq号当作key,查询出value,判断value是否为空
if(!StringUtils.isEmpty(code)){
//为空返回错误信息
return R.error().message("验证码错误或验证码已失效");
}
SimpleMailMessage message = new SimpleMailMessage();
// 发件人 你的邮箱
message.setFrom("3151637177@qq.com");
// 接收人 接收者邮箱
message.setTo(dstEmail);
//邮件标题
message.setSubject("谷粒学院注册用户验证码");
code = RandomUtil.getSixBitRandom();
//邮件内容
message.setText("您好,您正在注册谷粒学院账号,本次的验证码为:\n"+code+"\n"+"有效时间是5分钟,如非本人操作,请忽略此邮件!");
try{
javaMailSender.send(message);
System.out.println("QQ邮箱验证码 "+code);
//程序走到这说明需要新的验证码了,把验证码放到redis并添加过期时间为五分钟
redisTemplate.opsForValue().set(dstEmail,code,5, TimeUnit.MINUTES);
return R.ok().data("code",code);
}catch (Exception e){
e.printStackTrace();
return R.error().message("请检查您的QQ邮箱是否正确");
}
}
}
登录接口的代码和测试
创建新模块,使用代码生成器生成代码
![](https://img-blog.csdnimg.cn/img_convert/7fb97cb30fda02a73cd0d4041ead9ca8.png)
controller层
/**
* <p>
* 会员表 前端控制器
* </p>
*
* @author zyfTest
* @since 2023-01-29
*/
@RestController
@RequestMapping("/educenter/ucenter")
@CrossOrigin
public class UcenterMemberController {
@Autowired
private UcenterMemberService memberService;
@PostMapping ("login")
public R login(@RequestBody UcenterMember member){
//调用service查询用户名密码,返回一个 token
String token = memberService.login(member);
return R.ok().data("token",token);
}
}
service层
@Service
public class UcenterMemberServiceImpl extends ServiceImpl<UcenterMemberMapper, UcenterMember> implements UcenterMemberService {
//登录 前端传过来的有手机号和密码,手机号我这里直接用邮箱
@Override
public String login(UcenterMember member) {
//获取手机号和密码,判断是否为空,为空抛异常
String mobile = member.getMobile();
String password = member.getPassword();
if(StringUtils.isEmpty(mobile) || StringUtils.isEmpty(password)){
throw new GuliException(20001,"请输入邮箱和密码");
}
//不为空根据邮箱查询数据库,查询到对应的数据,返回一个用户对象
QueryWrapper<UcenterMember> wrapper = new QueryWrapper<>();
wrapper.eq("mobile",mobile);
UcenterMember ucenterMember = baseMapper.selectOne(wrapper);
//判断该用户对象是否为空,为空抛出异常
if(ucenterMember == null){
throw new GuliException(20001,"请检查您的邮箱和密码");
}
//不为空,根据前端传过来的密码判断是否和对象的密码一样,邮箱前面已经判断过了
if(!mobile.equals(ucenterMember.getMobile())){
throw new GuliException(20001,"请检查您的邮箱和密码");
}
//一样的话表示登录成功,判断该账号是否被禁用,被禁用抛出异常
if(ucenterMember.getIsDisabled()){
throw new GuliException(20001,"该账号已被禁用");
}
//没有被禁用根据查出的数据库对象的 id和name获取token
String jwtToken = JwtUtils.getJwtToken(ucenterMember.getId(), ucenterMember.getNickname());
//返回token
return jwtToken;
}
}
如果请求方式前后端不一样就会报,请求信息异常
![](https://img-blog.csdnimg.cn/img_convert/b77234c0d0b1adac1014e7968da48d62.png)
![](https://img-blog.csdnimg.cn/img_convert/ea89964bba9c676c46f26f0e2aa1ccde.png)
注册接口的代码和测试
controller层
@ApiOperation(value = "注册")
@PostMapping("register")
public R register(RegisterVo registerVo){
//调用service进行注册业务
memberService.regist(registerVo);
return R.ok();
}
service层
@Override
public void regist(RegisterVo registerVo) {
//获取封装的属性
String code = registerVo.getCode();
String nickname = registerVo.getNickname();
String mobile = registerVo.getMobile();
String password = registerVo.getPassword();
//判断是否为空,为空抛出异常
if(StringUtils.isEmpty(code) || StringUtils.isEmpty(nickname)
|| StringUtils.isEmpty(mobile) || StringUtils.isEmpty(password)){
throw new GuliException(20001,"请检查您的注册所需内容是否完善");
}
String substring = mobile.substring(0, mobile.lastIndexOf("@"));
String guli = "guli";
String newString = guli+substring;
//根据邮箱去数据库查询是否已经存在,已存在抛出异常
QueryWrapper<UcenterMember> wrapper = new QueryWrapper();
wrapper.eq("mobile",newString);
Integer integer = baseMapper.selectCount(wrapper);
if (integer > 0){
throw new GuliException(20001,"该邮箱已经被注册了");
}
//判断验证码是否一致,否则抛出异常,验证码从redis中取
String code2= redisTemplate.opsForValue().get(mobile);
if(!code2.equals(code)){
throw new GuliException(20001,"验证码错误或已经过期");
}
//将vo类的属性值赋值给数据库实体类
UcenterMember ucenterMember = new UcenterMember();
ucenterMember.setMobile(newString);
ucenterMember.setPassword(MD5.encrypt(password));//密码需要加密的
ucenterMember.setNickname(nickname);
ucenterMember.setAvatar("http://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eoj0hHXhgJNOTSOFsS4uZs8x1ConecaVOB8eIl115xmJZcT4oCicvia7wMEufibKtTLqiaJeanU2Lpg3w/132");
ucenterMember.setIsDeleted(false);
//将实体类存入数据库
baseMapper.insert(ucenterMember);
return;
}
根据token获取用户信息
//根据token获取用户信息
@ApiOperation(value = "token获取用户信息")
@GetMapping("tokenGetUser")
public R tokenGetUser(HttpServletRequest request){
String memberId = JwtUtils.getMemberIdByJwtToken(request);
UcenterMember ucenterMember = memberService.getById(memberId);
return R.ok().data("userInfo",ucenterMember)
}
element-ui版本npm install element-ui@2.15.6,页面正常显示