Cookie学习和个人浅见

前景回顾

以前在学习java web的时候,简单的一笔带过了Cookie,当时只是知道它就是可以保存信息在浏览器本地,类比着session。最近在一个项目中关于登录这里不用每次和数据库进行交互的问题,又再一次的深入了一下。

与Session相比的优势

1.Session保存在服务器上,Cookie保存在客户本地,显而易见当访问量大时候,保存到Cookie可以分担服务器压力。
2.在访问和保存一些非机密或安全性要求高的信息面前,Cookie派上大用场,且减少了与数据库的交互。

使用方法(挑重点的说)

1.request.getCookies(); //从request拿到Cookie集合
2.response.addCookie(cookie); //将Cookie输出到客户端
3.cookie.setMaxAge(300); // 设置生命周期300s(参数以秒为单位),
特别注意当为0时,即为删除该Cookie;-1时,客户端关闭则删除Cookie。

项目中用Cookie的小实例

/**
 * 登录界面输入用户名和密码后跳转处理代码
 **/
    protected void doPost(HttpServletRequest reqest, HttpServletResponse response) throws ServletException, IOException {
        User user = new User();
        user.setUserNum(req.getParameter("username"));
        user.setUserPw(req.getParameter("password"));
        //先拿到所有Cookie
        Cookie[] cookies = req.getCookies();
        Cookie cookieAccount = null;
        Cookie cookieSsid = null;
        String account = null;
        String ssid = null;
        //取到保存账号和加密后序列的Cookie
        for(Cookie cookieTemp : cookies){
            if(cookieTemp.getName().equals("account")){
                cookieAccount = cookieTemp;
            }
            if(cookieTemp.getName().equals("ssid")){
                cookieSsid = cookieTemp;
            }
        }

        LoginService login = new LoginServiceImpl();

        try {
            /**
             * 第一次登录的话(那两个Cookie为空,则是第一次登录或者说超时5min了)
             * 还是必须通过Dao层和数据库交互校验用户名和密码的
             */
            if(cookieAccount == null || cookieSsid==null){
                if(login.query(user).size()>0){
                    User userRs = login.query(user).get(0);
                    //若第一次登录成功则保存两个Cookie
                    cookieAccount = new Cookie("account", user.getUserNum());          //获取账号
                    cookieSsid = new Cookie("ssid", Encode.calcMD5(user.getUserNum()+user.getPassword()+KEY));   //这里KEY实际就是自己定义的一个私钥字符串。Encode.calcMD5(String str)是一个加密函数并返回加密结果(String类型)

                    //设置Cookie生命周期为300秒
                    cookieAccount.setMaxAge(300);
                    cookieSsid.setMaxAge(300);
                    resp.addCookie(cookieAccount);
                    resp.addCookie(cookieSsid);
                    req.getRequestDispatcher("/jsp/frame/main.jsp").forward(req, resp);
                    req.getSession().setAttribute("user",userRs);
                }else{
                    resp.sendRedirect(req.getContextPath()+"/login.jsp?err=yes");
                }
            }
            //这里就是使用到Cookie了
            else{
                //因为不是第一次登录且没超过生命周期,所以可以直接获取cookie的值
                account =  cookieAccount.getValue();
                ssid = cookieSsid.getValue();
                //这里就是校验用户名和密码的,确切的说是校验加密序列对不对,如果对就说明用户名和密码输入正确。
                //*****最重要的是,这里没在用Dao层与数据库来校验了*****
                if(ssid.equals(Encode.calcMD5(user.getUserNum()+user.getPassword()+KEY))){
                    req.getRequestDispatcher("/jsp/frame/main.jsp").forward(req, resp);
                    //req.getSession().setAttribute("user",userRs);
                }else{
                    resp.sendRedirect(req.getContextPath()+"/login.jsp?err=yes");
                }       
            }

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            resp.sendRedirect(req.getContextPath()+"/login.jsp?err=yes");
            e.printStackTrace();
        }
    }

}

后经测试也是没问题的,我的测试方法第一次老打老实的登录,然后退出在3min钟内(代码中设置Cookie的生命周期)内,关掉数据库的服务。再登录,依旧可以登录成功,妥妥的!

讲得粗糙了,若得更深入学习,可参考这篇博文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值