Java:Cookie实现记住用户名、密码

package com.laizhi.util;
002  
003 import java.io.IOException;
004  
005 import java.io.PrintWriter;
006  
007 import java.io.UnsupportedEncodingException;
008  
009 import javax.servlet.FilterChain;
010  
011 import javax.servlet.ServletException;
012  
013 import javax.servlet.http.Cookie;
014  
015 import javax.servlet.http.HttpServletRequest;
016  
017 import javax.servlet.http.HttpServletResponse;
018  
019 import javax.servlet.http.HttpSession;
020  
021 import java.security.MessageDigest;
022  
023 import java.security.NoSuchAlgorithmException;
024  
025 import com.laizhi.bean.User;
026  
027 import com.laizhi.dao.UserDAO;
028  
029 import com.laizhi.factory.DaoImplFactory;
030  
031 import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
032  
033 /*
034  
035 * 2014.07.01
036  
037 * */
038  
039 public class CookieUtil {
040        //保存cookie时的cookieName
041        private final static String cookieDomainName = “laizhi”;
042        //加密cookie时的网站自定码
043  
044        private final static String webKey = “123456”;
045        //设置cookie有效期是两个星期,根据需要自定义
046        private final static long cookieMaxAge = 60 * 60 * 24 * 7 * 2;
047        //保存Cookie到客户端-------------------------------------------------------------------------
048        //在CheckLogonServlet.java中被调用
049        //传递进来的user对象中封装了在登陆时填写的用户名与密码
050  
051        public static void saveCookie(User user, HttpServletResponse response) {
052               //cookie的有效期
053               long validTime = System.currentTimeMillis() + (cookieMaxAge * 5000);
054               //MD5加密用户详细信息
055               String cookieValueWithMd5 =getMD5(user.getUserName() + ":" + user.getPassword()
056  
057                             + ":" + validTime + ":" + webKey);
058               //将要被保存的完整的Cookie值
059               String cookieValue = user.getUserName() + ":" + validTime + ":" + cookieValueWithMd5;
060               //再一次对Cookie的值进行BASE64编码
061  
062               String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes()));
063               //开始保存Cookie
064               Cookie cookie = new Cookie(cookieDomainName, cookieValueBase64);
065               //存两年(这个值应该大于或等于validTime)
066               cookie.setMaxAge(60 * 60 * 24 * 365 * 2);
067  
068               //cookie有效路径是网站根目录
069  
070               cookie.setPath("/");
071  
072               //向客户端写入
073  
074               response.addCookie(cookie);
075  
076        }
077  
078         
079  
080        //读取Cookie,自动完成登陆操作----------------------------------------------------------------
081  
082        //在Filter程序中调用该方法,见AutoLogonFilter.java
083  
084        public static void readCookieAndLogon(HttpServletRequest request, HttpServletResponse response,
085  
086 FilterChain chain) throws IOException, ServletException,UnsupportedEncodingException{
087        //根据cookieName取cookieValue
088        Cookie cookies[] = request.getCookies();
089                      String cookieValue = null;
090                      if(cookies!=null){
091                             for(int i=0;i
092                                    if (cookieDomainName.equals(cookies[i].getName())) {
093                                           cookieValue = cookies[i].getValue();
094                                           break;
095                                    }
096  
097                             }
098  
099                      }
100                      //如果cookieValue为空,返回,
101                      if(cookieValue==null){
102                             return;
103                      }
104               //如果cookieValue不为空,才执行下面的代码
105               //先得到的CookieValue进行Base64解码
106               String cookieValueAfterDecode = new String (Base64.decode(cookieValue),"utf-8");
107               //对解码后的值进行分拆,得到一个数组,如果数组长度不为3,就是非法登陆
108               String cookieValues[] = cookieValueAfterDecode.split(":");
109               if(cookieValues.length!=3){
110                      response.setContentType("text/html;charset=utf-8");
111                      PrintWriter out = response.getWriter();
112                      out.println("你正在用非正常方式进入本站...");
113                      out.close();
114                      return;
115               }
116               //判断是否在有效期内,过期就删除Cookie
117               long validTimeInCookie = new Long(cookieValues[1]);
118               if(validTimeInCookie < System.currentTimeMillis()){
119                      //删除Cookie
120                      clearCookie(response);
121                      response.setContentType("text/html;charset=utf-8");
122                      PrintWriter out = response.getWriter();
123                      out.println("");你的Cookie已经失效,请重新登陆
124                      out.close();
125                      return;
126               }
127               //取出cookie中的用户名,并到数据库中检查这个用户名,
128               String username = cookieValues[0];
129                
130               //根据用户名到数据库中检查用户是否存在
131               UserDAO ud = DaoImplFactory.getInstance();
132               User user = ud.selectUserByUsername(username);
133  
134               //如果user返回不为空,就取出密码,使用用户名+密码+有效时间+ webSiteKey进行MD5加密
135               if(user!=null){
136                      String md5ValueInCookie = cookieValues[2];
137                      String md5ValueFromUser =getMD5(user.getUserName() + ":" + user.getPassword()
138                                    + ":" + validTimeInCookie + ":" + webKey);
139                      //将结果与Cookie中的MD5码相比较,如果相同,写入Session,自动登陆成功,并继续用户请求
140                      if(md5ValueFromUser.equals(md5ValueInCookie)){
141                             HttpSession session = request.getSession(true);
142                             session.setAttribute("user", user);
143                             chain.doFilter(request, response);
144                      }
145  
146               }else{
147  
148               //返回为空执行
149                      response.setContentType("text/html;charset=utf-8");
150                      PrintWriter out = response.getWriter();
151                      out.println("cookie验证错误!");
152                      out.close();
153                return;
154  
155              }
156  
157        }
158  
159         
160  
161        //用户注销时,清除Cookie,在需要时可随时调用-----------------------------------------------------
162        public static void clearCookie( HttpServletResponse response){
163               Cookie cookie = new Cookie(cookieDomainName, null);
164               cookie.setMaxAge(0);
165               cookie.setPath("/");
166               response.addCookie(cookie);
167        }
168  
169 //获取Cookie组合字符串的MD5码的字符串----------------------------------------------------------------
170               public static String getMD5(String value) {
171                      String result = null;
172                      try{
173                             byte[] valueByte = value.getBytes();
174                             MessageDigest md = MessageDigest.getInstance("MD5");
175                             md.update(valueByte);
176                             result = toHex(md.digest());
177                      } catch (NoSuchAlgorithmException e2){
178                             e1.printStackTrace();
179                      }
180                      return result;
181               }
182       //将传递进来的字节数组转换成十六进制的字符串形式并返回
183               private static String toHex(byte[] buffer){
184                      StringBuffer sb = new StringBuffer(buffer.length * 2);
185                      for (int i = 0; i < buffer.length; i++){
186                             sb.append(Character.forDigit((buffer[i] & 0xf0) >> 4, 16));
187                             sb.append(Character.forDigit(buffer[i] & 0x0f, 16));
188                      }
189                      return sb.toString();
190               }
191 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章