前景回顾
以前在学习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的生命周期)内,关掉数据库的服务。再登录,依旧可以登录成功,妥妥的!
讲得粗糙了,若得更深入学习,可参考这篇博文