中國加油,武漢加油!
篇幅較長,配合目錄觀看
案例準備
- 本案例基於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";
}