仿牛客网社区项目(七)登录和退出
开发登录功能
- 访问登录页面
- 点击顶部区域内的链接,打开登录页面。
- 登录
- 验证账号、密码、验证码。
- 成功时,生成登录凭证,发放给客户端。
- 失败时,跳转回登录页。
- 退出
- 将登录凭证修改为失效状态。
- 跳转至网站首页。
一、登录#
①首先将登录凭证封装成一个类LoginTicket
public class LoginTicket {
private int id;
private int userId;
private String ticket;
private int status;
private Date expired;
...
}
②在DAO包下新建LoginTicketMapper接口,定义与数据库的交互
@Mapper
public interface LoginTicketMapper {
@Insert({
"insert into login_ticket(user_id,ticket,status,expired) ",
"values(#{userId},#{ticket},#{status},#{expired})"
})
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertLoginTicket(LoginTicket loginTicket);
@Select({
"select id,user_id,ticket,status,expired ",
"from login_ticket where ticket=#{ticket}"
})
LoginTicket selectByTicket(String ticket);
@Update({
"update login_ticket set status=#{status} where ticket=#{ticket}"
})
int updateStatus(String ticket, int status);
}
③在测试类中进行测试,LoginTicketMapper类中定义的两个方法
@Test
public void testInsertLoginTicket(){
LoginTicket loginTicket = new LoginTicket();
loginTicket.setUserId(101);
loginTicket.setTicket("abc");
loginTicket.setStatus(0);
loginTicket.setExpired(new Date(System.currentTimeMillis() + 1000 * 60 * 10));
loginTicketMapper.insertLoginTicket(loginTicket);
}
@Test
public void testSelectLoginTicket(){
LoginTicket loginTicket = loginTicketMapper.selectByTicket("abc");
System.out.println(loginTicket);
loginTicketMapper.updateStatus("abc",1);
loginTicket = loginTicketMapper.selectByTicket("abc");
System.out.println(loginTicket);
}
④在服务层编写登录逻辑,包括实现账号密码的验证功能,生成登录凭证。这一层输入的输入值有账号,密码,有效期。
public Map<String,Object> login(String username, String password, int expiredSeconds){
Map<String, Object> map = new HashMap<>();
//空值处理
if(StringUtils.isBlank(username)){
map.put("usernameMsg","账号不能为空");
return map;
}
if(StringUtils.isBlank(password)){
map.put("passwordMsg","密码不能为空");
return map;
}
//验证账号
User user = userMapper.selectByName(username);
if(user == null){
map.put("usernameMsg","该账号不存在");
return map;
}
if(user.getStatus() == 0){
map.put("usernameMsg","该账号未激活");
return map;
}
//验证密码
password = CommunityUtil.md5(password + user.getSalt());
if(!user.getPassword().equals(password)){
map.put("passwordMsg","密码不正确");
return map;
}
//生成登录凭证
LoginTicket loginTicket = new LoginTicket();
loginTicket.setUserId(user.getId());
loginTicket.setTicket(CommunityUtil.generateUUID());
loginTicket.setStatus(0);
loginTicket.setExpired(new Date(System.currentTimeMillis() + expiredSeconds * 1000));
loginTicketMapper.insertLoginTicket(loginTicket);
map.put("ticket",loginTicket.getTicket());
return map;
}
⑤编写表现层(Controller)层的逻辑,(思维误区:数据都是从前端.html文件中读入的,而不是controller层)
成功时给客户端发送一个cookie,失败时跳转回登录页
@RequestMapping(path = "/login", method = RequestMethod.POST)
public String login(String username,String password,String code,boolean rememberme,
Model model,HttpSession session, HttpServletResponse response){
//检查验证码
String kaptcha = (String) session.getAttribute("kaptcha");
if(StringUtils.isBlank(kaptcha) ||StringUtils.isBlank(code) ||!kaptcha.equalsIgnoreCase(code) ){
model.addAttribute("codeMsg","验证码不正确");
return "/site/login";
}
//检查账号密码
int expiredSeconds = rememberme? REMEMBER_EXPIRED_SECONDS : DEFAULT_EXPIRED_SECONDS;
Map<String,Object> map = userService.login(username,password,expiredSeconds);
if(map.containsKey("ticket")){
Cookie cookie = new Cookie("ticket",map.get("ticket").toString());
cookie.setPath(contextPath);
cookie.setMaxAge(expiredSeconds);
response.addCookie(cookie);
return "redirect:/index";
}else{
model.addAttribute("usernameMsg",map.get("usernameMsg"));
model.addAttribute("passwordMsg",map.get("passwordMsg"));
return "/site/login";
}
}
⑥配置好对应的.html文件
二、退出#
⑦退出功能比较简单,只需将登录凭证修改为失效状态,LoginTicketMapper接口中已完成了和更新状态功能和数据库的交互,因此只需完成服务层和表现层的编写即可
服务层代码:
public void logout(String ticket){
loginTicketMapper.updateStatus(ticket,1);
}
表现层代码:
@RequestMapping(path = "/logout", method = RequestMethod.GET)
public String logout(@CookieValue("ticket") String ticket){
userService.logout(ticket);
return "redirect:/login";
}
完成对应的.html文件的配置
分类:
仿牛客网社区项目
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署