• 项目总结二:登录模块


    一、业务逻辑分析

    二、原型图

    三、实现过程

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

  • 相关阅读:
    含有tuple的list按照tuple中的某一位进行排序
    python
    Python代码追踪(类似于bash -x的效果)
    cinder swift的区别
    C#中Main函数为什么要static
    C#编程.函数.委托
    C#编程.函数.Main()函数
    C#编程.函数.参数
    typedef int a[10];怎么解释?
    C#的DateTime得到特定日期
  • 原文地址:https://www.cnblogs.com/xujian2014/p/5521515.html
Copyright © 2020-2023  润新知