🍁
博客主页:👉@不会压弯的小飞侠
✨欢迎关注:👉点赞👍收藏⭐留言✒
✨系列专栏:👉SpringBoot电商项目实战
✨学习社区:👉不会压弯的小飞侠
✨知足上进,不负野心。
🔥欢迎大佬指正,一起学习!一起加油!

当用户输入用户名和密码将数据提交给后台数据库进行查询,如果存在对应的用户名和密码则表示登录成功,登录成功之后跳转到系统的主页就是index.html页面,跳转在前端使用jquery来完成。
SELECT * FROM t_user WHERE username=?创建UserNotFoundException和PasswordNotMatchException异常类,以上异常类应继承自ServiceException类。1.如果用户名不存在则登录失败,抛出com.jkj.service.exception.UserNotFoundException异常,并从父
类生成子类的五个构造方法。
package com.jkj.service.exception;
/** 用户数据不存在的异常 */
public class UserNotFoundException extends ServiceException {
public UserNotFoundException() {
super();
}
public UserNotFoundException(String message) {
super(message);
}
public UserNotFoundException(String message, Throwable cause) {
super(message, cause);
}
public UserNotFoundException(Throwable cause) {
super(cause);
}
protected UserNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
2.如果用户的isDelete字段的值为1,则表示当前用户数据被标记为“已删除”,需进行登录失败操作同时
抛出UserNotFoundException。
3.如果密码错误则进行登录失败操作,同时抛出com.jkj.service.ex.PasswordNotMatchException
异常。
package com.jkj.service.exception;
/** 密码验证失败的异常 */
public class PasswordNotMatchException extends ServiceException {
public PasswordNotMatchException() {
super();
}
public PasswordNotMatchException(String message) {
super(message);
}
public PasswordNotMatchException(String message, Throwable cause) {
super(message, cause);
}
public PasswordNotMatchException(Throwable cause) {
super(cause);
}
protected PasswordNotMatchException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
/**
* 用户登录
* @param username 用户名
* @param password 密码
* @return 登录成功的用户数据
*/
User login(String username, String password);
@Override
public User login(String username, String password) {
// 调用userMapper的findByUsername()方法,根据参数username查询用户数据
User result = userMapper.findByUsername(username);
// 判断查询结果是否为null
if (result == null) {
// 是:抛出UserNotFoundException异常
throw new UserNotFoundException("用户数据不存在的错误");
}
// 判断查询结果中的isDelete是否为1
if (result.getIsDelete() == 1) {
// 是:抛出UserNotFoundException异常
throw new UserNotFoundException("用户数据不存在的错误");
}
// 从查询结果中获取盐值
String salt = result.getSalt();
// 调用getMd5Password()方法,将参数password和salt结合起来进行加密
String md5Password = getMd5Password(password, salt);
// 判断查询结果中的密码,与以上加密得到的密码是否不一致
if (!result.getPassword().equals(md5Password)) {
// 是:抛出PasswordNotMatchException异常
throw new PasswordNotMatchException("密码验证失败的错误");
}
// 创建新的User对象
User user = new User();
// 将查询结果中的uid、username、avatar封装到新的user对象中
user.setUid(result.getUid());
user.setUsername(result.getUsername());
user.setAvatar(result.getAvatar());
// 返回新的user对象
return user;
}
@Test
public void login() {
User user = iUserService.login("xfx", "123456");
System.out.println(user);
}

/** @ExceptionHandler用于统一处理方法抛出的异常 */
@ExceptionHandler({ServiceException.class, FileUploadException.class})
public JsonResult<Void> handleException(Throwable e) {
JsonResult<Void> result = new JsonResult<Void>(e);
if (e instanceof UsernameDuplicateException) {
result.setState(4000);
}
else if (e instanceof UserNotFoundException) {
result.setState(4001);
}
else if (e instanceof PasswordNotMatchException) {
result.setState(4002);
}
else if (e instanceof InsertException) {
result.setState(5000);
}
return result;
}
@RequestMapping("login")
public JsonResult<User> login(String username,String password) {
User data = userService.login(username, password);
return new JsonResult<User>(OK,data);
}
http://localhost:8080/users/login?username=xfx&password=123456请求进行登录。
<!--页脚结束-->
<script type="text/javascript">
$("#btn-login").click(function() {
$.ajax({
url: "/users/login",
type: "POST",
data: $("#form-login").serialize(),
dataType: "json",
success: function(json) {
if (json.state == 200) {
alert("登录成功!");
location.href = "index.html";
} else {
alert("登录失败!" + json.message);
}
}
});
});
</script>
http://localhost:8080/web/login.html进行登录


session对象主要存在服务器端,可以用于保存服务器的临时数据的对象,所保存的数据可以在整个项目中都可以通过访问来获取,把session的数据看做一个共享的数据。首次登录的时候所获取的用户的数据,转移到session对象即可。seession.getAttrbute(“key”)可以将获取session中的数据这种行为进行封装,封装在BaseController类中。
封装session对象中数据的获取(封装父类中)、数据的设置(当用户登录成功后进行数据的设置,设置到全局的session对象)。
在父类中封装两个数据:获取uid和获取username对应的两个方法。用户头像暂时不考虑,将来封装cookie中来使用。
1.重新构建login()方法,登录成功后将uid和username存入到HttpSession对象中。
/**
* 优化登录
* @param username
* @param password
* @param session
* @return
*/
@RequestMapping("login")
public JsonResult<User> login(String username, String password, HttpSession session) {
// 调用业务对象的方法执行登录,并获取返回值
User data = userService.login(username, password);
//登录成功后,将uid和username存入到HttpSession中
session.setAttribute("uid", data.getUid());
session.setAttribute("username", data.getUsername());
// System.out.println("Session中的uid=" + getUidFromSession(session));
// System.out.println("Session中的username=" + getUsernameFromSession(session));
// 将以上返回值和状态码OK封装到响应结果中并返回
return new JsonResult<User>(OK, data);
}
/**
* 从HttpSession对象中获取uid
* @param session HttpSession对象
* @return 当前登录的用户的id
*/
protected final Integer getUidFromSession(HttpSession session) {
return Integer.valueOf(session.getAttribute("uid").toString());
}
/**
* 从HttpSession对象中获取用户名
* @param session HttpSession对象
* @return 当前登录的用户名
*/
protected final String getUsernameFromSession(HttpSession session) {
return session.getAttribute("username").toString();
}
学习视频:
【SpringBoot项目实战完整版】SpringBoot+MyBatis+MySQL电脑商城项目实战-哔哩哔哩】
https://b23.tv/qGh9x9L
