返回

白卷项目二次优化,经验直通车!

后端

统一返回格式封装

在白卷项目中,不同的接口返回的格式不统一,这给前端的开发和维护带来了很大的不便。为了解决这个问题,我们对返回格式进行了统一封装。

我们定义了一个通用的返回对象,包含了以下属性:

  • 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";
        }
    }

}

通过以上优化,我们提高了白卷项目的安全性。