项目总结二:登录模块

一、业务逻辑分析

二、原型图

三、实现过程

  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即可。

posted @ 2016-05-24 15:33  温布利往事  阅读(794)  评论(0编辑  收藏  举报