注冊加密
/**
* 處理注冊業務
* @param username
* @param password
* @param phone
* @param email
* @param session
* @return
*/
@RequestMapping(value="/handle_reg.do",method=RequestMethod.POST)
@ResponseBody//實質内容
public ResponseResult<Void> handleReg(String username,
String password,String phone,String email,
HttpSession session){
ResponseResult<Void> rr;
User user=new User();
user.setUsername(username);
user.setPassword(password);
user.setPhone(phone);
user.setEmail(email);
try{
User u=userService.reg(user);
session.setAttribute("uid", u.getId());
session.setAttribute("username", u.getUsername());
rr=new ResponseResult<Void>(ResponseResult.STATE_OK);
}catch(UsernameConflictException e){
rr=new ResponseResult<Void>(e);
}
return rr;
}
@Transactional//注釋事務:一旦抛出RuntimeException異常,事務自動復原
public User reg(User user) {
//根據嘗試注冊的使用者名進行查詢,判斷使用者名是否被占用
User u=findUserByUsername(user.getUsername());
if(u!=null){
//使用者名被占用,則:
throw new UsernameConflictException("使用者名"+user.getUsername()+"已經被注冊");
}else{
//使用者名未被占用,則執行注冊:
//把密碼加密。
String salt=UUID.randomUUID().toString();
String md5Password=getEncrpytedPassword(user.getPassword(), salt);
user.setPassword(md5Password);
//儲存salt,即鹽
user.setUuid(salt);
//儲存日志資訊
Date now=new Date();
user.setCreatedUser("System");
user.setCreatedTime(now);
user.setModifiedUser("System");
user.setModifiedTime(now);
//使用Mybatis處理insert後,資料的id 将會被封裝到這個對象中。
//在執行以下代碼之前,user中并沒有id,執行結束後MyBatis會将id封裝到user參數中。
//UserMapper.xml參數中需要設定屬性useGeneratedKeys="true" keyProperty="id"。
userMapper.insert(user);
return user;
}
}
登入時對登入密碼加密後對比
@RequestMapping(value="/handle_login.do",method=RequestMethod.POST)
@ResponseBody
public ResponseResult<Void> handleLogin(String username,String password,HttpSession session){
ResponseResult<Void> rr;
try{
User user=userService.login(username, password);
session.setAttribute("uid", user.getId());
session.setAttribute("username", user.getUsername());
rr=new ResponseResult<Void>(ResponseResult.STATE_OK);
}catch(ServiceException e){
rr=new ResponseResult<Void>(e);
}
return rr;
}
public User login(String username, String password) {
//根據使用者名查詢使用者資訊
User user=findUserByUsername(username);
//判斷是否查詢到比對的使用者資訊
if(user==null){
//沒有:抛出異常,使用者名不存在UsernameNotExitException
throw new UserNotExitException("使用者名"+username+"不存在");
}else{//存在:繼續
//擷取該使用者的鹽(UUID)
String salt=user.getUuid();
//基于鹽,對使用者輸入的密碼進行加密
String md5Password=getEncrpytedPassword(password, salt);
//判斷加密後的密碼與擷取的使用者資訊中的密碼是否比對
if(md5Password.equals(user.getPassword())){
//比對,傳回查詢到的User對象
return user;
}else{
//不比對,抛出異常:密碼不比對PasswordNotMatchException
throw new PasswordNotMatchException("密碼不正确");
}
}
}