1. 异常处理
业务层抛出的异常,需要在统一异常处理类中进行捕获和处理;如果抛出的异常类型已经在统一异常处理类中处理过,则不需要重复处理。
2. 设计请求
请求路径:/users/login
请求方法:POST
请求数据:String username, String password
响应结果:JsonResult< User >
3. 处理请求
UserController类中添加控制器方法:
@RequestMapping("/login")
public JsonResult<User> login(String username, String password) {
User user = userService.login(username, password);
return new JsonResult<>(OK, user);
}
4. 测试
正常访问:
用户名不存在情况:
用户密码错误情况:
5. 优化-用户会话session
用户登录的数据信息在其他页面也会用到,因此考虑在登录时所获取的用户数据,转移到session对象。
- session对象主要存在服务器端,可以用于保存服务器的临时数据的对象,所保存的数据可以在整个项目中访问获取,把session的数据看作一个共享的数据。首次登录时所获取的用户数据,转移到session对象即可。session.getAttribute(“key”)可以将获取session中的数据这种行为进行封装,封装在BaseController类中。
/*从session中获取uid
protected:不同包的子类可以访问
final:不能再被更改(子类重写)
HttpSession是接口,session是该接口实现类的实例对象
*/
protected final Integer getUidFromSession(HttpSession session) {
return Integer.valueOf(session.getAttribute("uid").toString());
}
/*从session中获取username
*/
protected final String getUsernameFromSession(HttpSession session) {
return session.getAttribute("username").toString();
}
- 在登陆的控制器方法中将数据封装到session对象中。服务器本身自动创建了session对象,已经是一个全局的session对象。Springboot直接使用session对象,将HttpSession类型的对象作为请求处理方法的形参,会自动将全局session对象注入到请求处理方法的形参中。
@RequestMapping("/login")
public JsonResult<User> login(String username, String password, HttpSession session) {
User data = userService.login(username, password);
//向session对象中完成数据的绑定(session是全局的)
session.setAttribute("uid", data.getUid());
session.setAttribute("username", data.getUsername());
//测试一下是否能拿到数据
// System.out.println(getUidFromSession(session));
// System.out.println(getUsernameFromSession(session));
return new JsonResult<>(OK, data);
}
```