@Controller
@RequestMapping("/login")
public class LoginController {
private static Set<User> dbUser;
/**
* 模拟数据库中的数据
*/
static {
dbUser = new HashSet<>();
dbUser.add(new User(1, "adx", "123456"));
dbUser.add(new User(2, "admin", "123456"));
}
/**
*这是 一个登录接口 是用来登陆的
*/
@PostMapping
public String doLogin(User user, HttpSession session, HttpServletResponse response) {
String target = (String) session.getAttribute("target");
//模拟去数据库中查找
Optional<User> first = dbUser.stream().filter(dbUser -> dbUser.getUsername().equals(user.getUsername()) &&
dbUser.getPassword().equals(user.getPassword()))
.findFirst();
if (first.isPresent()) {
String token = UUID.randomUUID().toString();
Cookie cookie = new Cookie("TOKEN", token);
//设置跨域 可在同一应用服务器内共享方法:设置cookie.setPath("/");
cookie.setPath("/");
//一级域名如 baidu.com
//二级域名如 hao.baidu.com
//三级域名如 www.hao.baidu.com
//三级域名包含二级域名,二级域名包含一级域名
//setDomain方法须以 . 开头,如cookie.setDomain(".baidu.com"),
cookie.setDomain("codeshop.com");
response.addCookie(cookie);
LogCacheUtil.loginUser.put(token, first.get());
} else {
//登录失败
session.setAttribute("msg", "用户名或密码错误!");
return "login";
}
return "redirect:" + target;
}
/**
* 为外部提供一个接口 用来token 校验
*/
@GetMapping("info")
@ResponseBody
public ResponseEntity<User> getUserInfo(String token) {
if (!StringUtils.isEmpty(token)) {
//获取token 中的用户校验 可以换用redis 存储 或者数据库也可以
User user = LogCacheUtil.loginUser.get(token);
return ResponseEntity.ok(user);
} else {
//当token 为空返回一个Bad Request
return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
}
}
/**
* 退出接口 退出token
*/
@GetMapping("/logout")
public String loginOut(@CookieValue(value = "TOKEN") Cookie cookie, HttpServletResponse response, String target) {
//设置cookie 的过期时间
cookie.setMaxAge(0);
//设置用户的退出
LogCacheUtil.loginUser.remove(cookie.getValue());
//增加cookie
response.addCookie(cookie);
return "redirect:" + target;
}
}
/**
* 用来模拟数据库或者redis 存储数据
**/
public class LogCacheUtil {
public static Map<String, User> loginUser = new HashMap<>();
}