项目总结二:登录模块
一、业务逻辑分析
二、原型图
三、实现过程
1、表单校验
同注册一样需要做前端表单校验。(详细见注册模块:http://www.cnblogs.com/xujian2014/p/5520732.html)
2、记住用户名
在用户名文本框中显示cookie中保存的loginname,当用户登录成功后,会把当前用户的名称保存到cookie中,当用户再次登录到页面时,会在文本框中显示用户名。
<script type="text/javascript"> $(function() { /*Map<String(Cookie名称),Cookie(Cookie本身)>*/ // 获取cookie中的用户名 var loginname = window.decodeURI("${cookie.loginname.value}"); if("${requestScope.user.loginname}") { loginname = "${requestScope.user.loginname}"; } $("#loginname").val(loginname); }); </script>
3、服务器端代码
当login.jsp通过前端表单校验后,会请求UserServlet#login()方法:
- 封装表单数据到User(formBean)对象中;
- 对formBean进行校验,如果出现错误把错误信息保存到Map中,把Map保存到request中,转发到login.jsp显示,为了回显把formBean也保存到request中;
- 调用UserService#login(User formBean)方法;
- 如果返回的user为null,那么说明用户名或密码为空,保存错误信息到request中,转发到login.jsp;
- 如果user.isStatus()为false,说明用户还没有激活,保存错误信息到request中,转发到login.jsp
- 如果返回的user不为null,说明登录成功,保存user到session中。保存当前用户名到cookie中(为了让login.jsp页面记住当前用户名)。转发到主页;
/** * 登录功能 * @param req * @param resp * @return * @throws ServletException * @throws IOException */ public String login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* * 1. 封装表单数据到user */ User formUser = CommonUtils.toBean(req.getParameterMap(), User.class); /* * 2. 校验 */ Map<String,String> errors = validateLogin(formUser, req.getSession()); if(errors.size() > 0) { req.setAttribute("form", formUser); req.setAttribute("errors", errors); return "f:/jsps/login.jsp"; } /* * 3. 调用userService#login()方法 */ User user = userService.login(formUser); /* * 4. 开始判断 */ if(user == null) { req.setAttribute("msg", "用户名或密码错误!"); req.setAttribute("user", formUser); return "f:/jsps/login.jsp"; } else { if(!user.isStatus()) { req.setAttribute("msg", "您还没有激活!"); req.setAttribute("user", formUser); return "f:/jsps/login.jsp"; } else { // 保存用户到session req.getSession().setAttribute("sessionUser", user); // 获取用户名保存到cookie中 String loginname = user.getLoginname(); loginname = URLEncoder.encode(loginname, "utf-8"); Cookie cookie = new Cookie("loginname", loginname); cookie.setMaxAge(60 * 60 * 24 * 10);//保存10天 resp.addCookie(cookie); return "r:/index.jsp";//重定向到主页 } } }
4、登录成功
当用户登录成功后,会重定向到index.jsp,这是会显示所有的超链接,所以需要根据用户是否登录来显示不同的超链接。
用户未登录时显示:登录、注册
用户登录时显示:会员姓名,修改密码,菜单1,2,3...等
因为用户登录成功后,当前用户已经保存到session中,所以我们只要在index.jsp中判断session中是否存在user即可分别用户是否登录。
5、退出
当用户登录成功后,会把当前user保存到session中。退出只需要从session中移除user即可,然后重定向到login.jsp即可。