白卷项目二次优化,经验直通车!
2023-11-17 20:12:35
统一返回格式封装
在白卷项目中,不同的接口返回的格式不统一,这给前端的开发和维护带来了很大的不便。为了解决这个问题,我们对返回格式进行了统一封装。
我们定义了一个通用的返回对象,包含了以下属性:
- code:状态码,表示请求是否成功
- msg:消息,表示请求成功或失败的原因
- data:数据,表示请求成功时返回的数据
public class Result<T> {
private Integer code;
private String msg;
private T data;
public Result() {
}
public Result(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
//省略getter和setter方法
}
在接口的实现中,我们将返回结果封装成Result对象。
@Override
public Result<User> login(String username, String password) {
User user = userService.login(username, password);
if (user != null) {
return new Result<>(200, "登录成功", user);
} else {
return new Result<>(400, "登录失败", null);
}
}
前端在接收返回结果时,只需要解析Result对象即可。
$.ajax({
url: "/login",
method: "POST",
data: {
username: "zhangsan",
password: "123456"
},
success: function (result) {
if (result.code === 200) {
//登录成功
} else {
//登录失败
}
}
});
Web层全局异常处理器
在白卷项目中,当控制器抛出异常时,前端并不能收到友好的错误提示。为了解决这个问题,我们需要实现一个Web层全局异常处理器。
我们定义了一个全局异常处理器类,继承自Spring Boot提供的@ControllerAdvice
和@RestControllerAdvice
注解。
@ControllerAdvice
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result<String> handleException(Exception e) {
e.printStackTrace();
return new Result<>(500, "系统错误", null);
}
}
在该类中,我们重写了@ExceptionHandler
方法,该方法可以捕获控制器抛出的所有异常。在该方法中,我们将异常信息打印到控制台,并返回一个统一的错误结果。
登录优化
在白卷项目中,登录接口的实现比较简单,并没有考虑一些安全方面的因素。为了提高登录的安全性,我们需要对登录接口进行优化。
我们首先对登录密码进行了加密处理。在用户注册时,我们会将用户的密码加密存储在数据库中。在用户登录时,我们会将用户输入的密码加密后与数据库中的密码进行比较。
public class UserService {
public User login(String username, String password) {
User user = userRepository.findByUsername(username);
if (user != null && user.getPassword().equals(password)) {
return user;
} else {
return null;
}
}
}
我们还对登录失败的次数进行了限制。当用户连续登录失败一定次数后,我们将禁止该用户继续登录。
public class UserService {
public User login(String username, String password) {
User user = userRepository.findByUsername(username);
if (user != null && user.getPassword().equals(password)) {
user.setLoginFailCount(0);
userRepository.save(user);
return user;
} else {
user.setLoginFailCount(user.getLoginFailCount() + 1);
userRepository.save(user);
if (user.getLoginFailCount() >= 5) {
user.setStatus(0);
userRepository.save(user);
return null;
}
return null;
}
}
}
登录认证
在白卷项目中,我们并没有对用户进行登录认证。这意味着用户可以在没有登录的情况下访问任何接口。为了提高系统的安全性,我们需要对用户进行登录认证。
我们首先在Spring Security中定义了一个登录过滤器。该过滤器会拦截所有请求,并检查用户是否已登录。如果用户已登录,则允许用户继续访问。如果用户未登录,则跳转到登录页面。
public class LoginFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//检查用户是否已登录
if (request.getSession().getAttribute("user") != null) {
//已登录,继续访问
filterChain.doFilter(request, response);
} else {
//未登录,跳转到登录页面
response.sendRedirect("/login");
}
}
}
我们还定义了一个登录控制器,用于处理用户的登录请求。
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String login(String username, String password) {
//查询用户是否存在
User user = userRepository.findByUsername(username);
if (user != null && user.getPassword().equals(password)) {
//用户存在,登录成功
request.getSession().setAttribute("user", user);
return "redirect:/index";
} else {
//用户不存在或密码错误,登录失败
return "login";
}
}
}
通过以上优化,我们提高了白卷项目的安全性。