中国加油,武汉加油!
篇幅较长,配合目录观看
案例准备
- 本案例基于springboot篇】二十一. 基于springboot电商项目 八 邮件发送和注册
1. 修改密码
1.1 shop-common编写常量类
package com.wpj.common.constant;
public interface Constants {
String EMAIL_CODE = "_code";
String UPPASS_TOKEN ="_token";
String LOGIN_TOKEN = "login_token";
String CART_TOKEN="cart_token";
Integer ORDER_DB_NUM = 2;
Integer ORDER_TAB_NUM = 2;
}
1.2 shop-sso编写toInputUsername.html
1.3 Controller编写方法
@RequestMapping(value = "/inputUsername")
public String inputUsername(String username, ModelMap map){
User user = userService.selectByUsername(username);
if(user != null){
String token = UUID.randomUUID().toString();
redisTemplate.opsForValue().set(username+Constants.UPPASS_TOKEN,token,5,TimeUnit.MINUTES);
String uppassUrl ="http://localhost:8084/toUpdatePassword?username="+user.getUsername()+"&token="+token;
String userEmail = user.getEmail();
Email email = new Email();
email.setTitle("用户修改密码");
email.setContent("连接:"+uppassUrl);
email.setTo(user.getEmail());
rabbitTemplate.convertAndSend("email_exchange","",email);
String emailTemp = userEmail.replace(userEmail.substring(4, userEmail.indexOf("@")), "*****");
String toEmail =userEmail.replace(userEmail.substring(0,userEmail.indexOf("@")+1),"email.");
map.put("msg","修改密码的连接已经发送您的【"+emailTemp+"】邮箱,请点击<a href='http://"+toEmail+"'>这里</a>登陆");
}else{
map.put("msg","该【"+username+"】不存在");
}
return "inputUsername";
}
1.4 编写updatePassword.html
1.5 修改 shop-front的index.html表单的提交方式为Get
1.6 Controller编写方法
@RequestMapping(value = "/updatePassword")
@ResponseBody
public ResultEntity updatePassword(String username,String newpass,String token){
String redisToken = (String)redisTemplate.opsForValue().get(username + Constants.UPPASS_TOKEN);
if(redisToken != null && redisToken.equals(token)){
User user = userService.selectByUsername(username);
if(user != null){
user.setPassword(newpass);
userService.update(user);
redisTemplate.delete(username+Constants.UPPASS_TOKEN);
return ResultEntity.SUCCESS("http://localhost:8084/toLogin");
}else{
return ResultEntity.FALL("用户名不存在");
}
}else{
return ResultEntity.FALL("连接有误");
}
}
2. 登录
2.1 shop-common导包
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.4</version>
</dependency>
2.2 shop-common编写PasswordUtils
package com.wpj.common.utils;
import org.mindrot.jbcrypt.BCrypt;
public class PasswordUtils {
public static String hashpw(String pw){
return BCrypt.hashpw(pw,BCrypt.gensalt());
}
public static Boolean checkpw(String logPw,String codePw){
return BCrypt.checkpw(logPw,codePw);
}
}
2.3 shop-sso导包和
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
2.4 shop-sso的Controller编写方法
@RequestMapping(value = "/login")
@ResponseBody
public ResultEntity login(String username, String password, String returnUrl,HttpServletResponse resp){
User user = userService.selectByUsername(username);
if(user != null){
if(PasswordUtils.checkpw(password,user.getPassword())){
redisTemplate.opsForValue().set(username,user,5,TimeUnit.DAYS);
Cookie cookie = new Cookie(Constants.LOGIN_TOKEN,username);
cookie.setMaxAge(60*60*24*5);
cookie.setHttpOnly(false);
cookie.setPath("/");
resp.addCookie(cookie);
if(StringUtils.isEmpty(returnUrl)){
returnUrl = "http://localhost:8081/";
}
return ResultEntity.SUCCESS(returnUrl);
}else{
return ResultEntity.FALL("用户名或密码错误");
}
}else{
return ResultEntity.FALL("用户名不存在");
}
}
@RequestMapping(value = "/isLogin")
@ResponseBody
public String isLogin(String callback, @CookieValue(name = Constants.LOGIN_TOKEN,required =false) String loginToken){
System.out.println("SSOController.isLogin token:"+loginToken);
String jsonStr = "";
if(!StringUtils.isEmpty(loginToken)){
User user= (User) redisTemplate.opsForValue().get(loginToken);
user.setPassword("");
jsonStr = new Gson().toJson(user);
}
return callback == null?jsonStr :callback+"('"+jsonStr +"')";
}
2.5 编写login.js
2.6 shop-front的index.html引入login.js
<script type="text/javascript" src="http://localhost:8084/js/login.js"></script>
3. 注销
3.1 shop-sso的Controller编写logout方法
@RequestMapping(value = "/logout")
public String logout(@CookieValue(name = Constants.LOGIN_TOKEN,required = false) String loginToken,HttpServletResponse resp){
redisTemplate.delete(loginToken);
Cookie cookie = new Cookie(Constants.LOGIN_TOKEN,"");
cookie.setMaxAge(-1);
cookie.setPath("/");
cookie.setHttpOnly(false);
resp.addCookie(cookie);
return "redirect:http://localhost:8084/toLogin";
}