读书人

cook的施用(两星期自动登录)

发布时间: 2012-12-28 10:29:05 作者: rapoo

cook的使用(两星期自动登录)
  //将要被保存的完整的Cookie值
  String cookieValue = user.getUserName() + ":" + validTime + ":" + cookieValueWithMd5;
  //再一次对Cookie的值进行BASE64编码
  String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes()));
  //开始保存Cookie
  Cookie cookie = new Cookie(cookieDomainName, cookieValueBase64);
  //存两年(这个值应该大于或等于validTime)
  cookie.setMaxAge(60 * 60 * 24 * 365 * 2);
  //cookie有效路径是网站根目录
  cookie.setPath("/");
  //向客户端写入
  response.addCookie(cookie);
  }
  //读取Cookie,自动完成登陆操作--------------------------------------------------------
  //在Filter程序中调用该方法,见AutoLogonFilter.java
  public static void readCookieAndLogon(HttpServletRequest request, HttpServletResponse response,
  FilterChain chain) throws IOException, ServletException,UnsupportedEncodingException{
  //根据cookieName取cookieValue
  Cookie cookies[] = request.getCookies();
  String cookieValue = null;
  if(cookies!=null){
  for(int i=0; i<cookies.length; i++){
  if (cookieDomainName.equals(cookies[i].getName())) {
  cookieValue = cookies[i].getValue();
  break;
  }
  }
  }
  //如果cookieValue为空,返回,
  if(cookieValue==null){
  return;
  }
  //如果cookieValue不为空,才执行下面的代码
  //先得到的CookieValue进行Base64解码
  String cookieValueAfterDecode = new String (Base64.decode(cookieValue),"utf-8");
  //对解码后的值进行分拆,得到一个数组,如果数组长度不为3,就是非法登陆
  String cookieValues[] = cookieValueAfterDecode.split(":");
  if(cookieValues.length!=3){
  response.setContentType("text/html; charset=utf-8");
  PrintWriter out = response.getWriter();
  out.println("你正在用非正常方式进入本站...");
  out.close();
  return;
  }
  //判断是否在有效期内,过期就删除Cookie
  long validTimeInCookie = new Long(cookieValues[1]);
  if(validTimeInCookie < System.currentTimeMillis()){
  //删除Cookie
  clearCookie(response);
  response.setContentType("text/html; charset=utf-8");
  PrintWriter out = response.getWriter();
  out.println("<a href=’logon.jsp’>你的Cookie已经失效,请重新登陆</a>");
  out.close();
  return;
  }
  //取出cookie中的用户名,并到数据库中检查这个用户名,
  String username = cookieValues[0];
  //根据用户名到数据库中检查用户是否存在
  UserDAO ud = DaoImplFactory.getInstance();
  User user = ud.selectUserByUsername(username);
  //如果user返回不为空,就取出密码,使用用户名+密码+有效时间+ webSiteKey进行MD5加密
  if(user!=null){
  String md5ValueInCookie = cookieValues[2];
  String md5ValueFromUser =getMD5(user.getUserName() + ":" + user.getPassword()+ ":" + validTimeInCookie + ":" + webKey);
  //将结果与Cookie中的MD5码相比较,如果相同,写入Session,自动登陆成功,并继续用户请求
  if(md5ValueFromUser.equals(md5ValueInCookie)){
  HttpSession session = request.getSession(true);
  session.setAttribute("user", user);
  chain.doFilter(request, response);
  }
  }else{
  //返回为空执行
  response.setContentType("text/html; charset=utf-8");
  PrintWriter out = response.getWriter();
  out.println("cookie验证错误!");
  out.close();
  return;
  }
  }
  //用户注销时,清除Cookie,在需要时可随时调用------------------------
  public static void clearCookie( HttpServletResponse response){
  Cookie cookie = new Cookie(cookieDomainName, null);
  cookie.setMaxAge(0);
  cookie.setPath("/");
  response.addCookie(cookie);
  }
  //获取Cookie组合字符串的MD5码的字符串----------------------------------------
  public static String getMD5(String value) {
  String result = null;
  try{
  byte[] valueByte = value.getBytes();
  MessageDigest md = MessageDigest.getInstance("MD5");
  md.update(valueByte);
  result = toHex(md.digest());
  } catch (NoSuchAlgorithmException e2){
  e1.printStackTrace();
  }
  return result;
  }
  //将传递进来的字节数组转换成十六进制的字符串形式并返回
  private static String toHex(byte[] buffer){
  StringBuffer sb = new StringBuffer(buffer.length * 2);
  for (int i = 0; i < buffer.length; i++){
  sb.append(Character.forDigit((buffer[i] &0xf0) >>4, 16));
  sb.append(Character.forDigit(buffer[i] &0x0f, 16));
  }
  return sb.toString();
  }
  }
  下面的是对CookieUtil工具类各方法的调用演示:
  User.java
  封装用户信息的JavaBean对象模型
  package com.itcast.bean;
  public class User {
  private int id;
  private String userName;
  private String password;
  public String getPassword() {
  return password;
  }
  public void setPassword(String password) {
  this.password = password;
  }
  public String getUserName() {
  return userName;
  }
  public void setUserName(String userName) {
  this.userName = userName;
  }
  public int getId() {
  return id;
  }
  public void setId(int id) {
  this.id = id;
  }
  }
  AutoLogonFilter.java
  过滤器程序,可在WEB-INF/web.xml中设置过滤规则,本文对过滤规则不作介绍,此程序主要作用是检查用户在上一次登陆时是否保存了Cookie,如果保存了,就处理Cookie信息,并帮助用户自动登陆
  本程序主要调用了CookieUtil.java中的读取与自动登陆方法,即readCookieAndLogon方法
  package cn.itcast.filter;
  import java.io.IOException;
  import javax.servlet.Filter;
  import javax.servlet.FilterChain;
  import javax.servlet.FilterConfig;
  import javax.servlet.ServletException;
  import javax.servlet.ServletRequest;
  import javax.servlet.ServletResponse;
  import javax.servlet.http.Cookie;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import javax.servlet.http.HttpSession;
  import cn.itcast bean.User;
  import cn.itcast.util.CookieUtil;
  public class AutoLogonFilter implements Filter {
  public void destroy() {
  }
  //保存cookie时的cookieName,与CookieUtil.java中的设置相同
  private final static String cookieDomainName = “cn.itcast”;
  
  public void doFilter(ServletRequest req, ServletResponse resp,
  FilterChain chain) throws IOException, ServletException {
  HttpServletRequest request = (HttpServletRequest)req;
  HttpServletResponse response = (HttpServletResponse)resp;
  HttpSession session = request.getSession(true);
  User user = (User)session.getAttribute("user");
  //如果封装的user不为空,说明已经登陆,则继续执行用户的请求.下面的就不处理了
  if(user!=null){
  chain.doFilter(request,response);
  return;
  }
  //user为空,说明用户还没有登陆,就尝试得到浏览器传送过来的Cookie
  Cookie cookies[] = request.getCookies();
  String cookieValue = null;
  if(cookies!=null){
  for(int i=0; i<cookies.length; i++){
  if (cookieDomainName.equals(cookies[i].getName())) {
  cookieValue = cookies[i].getValue();
  break;
  }
  }
  }
  //如果cookieValue为空,也继续执行用户请求
  if(cookieValue==null){
  chain.doFilter(request,response);
  return;
  }
  //cookieValue不为空执行下面的方法,调用CookieUtil.java中的readCookieAndLogon方法
  try{
  CookieUtil.readCookieAndLogon(cookieValue, request, response, chain);
  }catch(Exception e){
  e.printStackTrace();
  }
  }
  public void init(FilterConfig arg0) throws ServletException {
  }
  }
  CheckLogonServlet.java
  验证用户登陆信息的Servlet,此程序调用了CookieUtil.java中的saveCookie方法
  package cn.itcast.servlet;
  /*
  * update 2007.09.23 by lyhapple
  * 检查用户登陆
  * */
  import java.io.IOException;
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import javax.servlet.http.HttpSession;
  import cn.itcast.bean.User;
  import cn.itcast.dao.UserDAO;
  import cn.itcast.factory.DaoImplFactory;
  import cn.itcast.util.CookieUtil;
  public class CheckLogonServlet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
  doPost(request, response);
  }
  public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
  request.setCharacterEncoding("utf-8");
  String username = request.getParameter("username").trim();
  String password = CookieUtil.getMD5(request.getParameter("password"));
  String remeberMe = request.getParameter("remeberMe");
  HttpSession session = request.getSession(false);
  // 将接收到的用户名传递到UserDao的checkUser方法中,检查用户
  // 返回一个User类型的对象
  UserDAO ud = DaoImplFactory.getInstance();
  User user = ud.selectUserByUsername(username);
  if (user == null) {
  request.setAttribute("checkUserError","<a href='register.jsp'><font color=red>用户名不存在,请先注册</font></a>");
  request.getRequestDispatcher("index.jsp").forward(request, response);
  return;
  }
  if(!password.equals(user.getPassword())){
  request.setAttribute("checkPasswordError","<font color=red>密码输入错误,请重新输入</font>");
  request.getRequestDispatcher("index.jsp").forward(request, response);
  return;
  }
  //保存Cookie,这里调用了CookieUtil.java中的saveCookie方法,将上面的user对象作为参数传递
  if ("on".equals(remeberMe)) {
  CookieUtil.saveCookie(user, response);
  }
  //在Session中保存用户信息,并转向用户的个人信息页面
  session.setAttribute("user", user);
  request.getRequestDispatcher("User/userInfo.jsp").forward(request,response);
  }
  }
  UserDAO.java与DaoImplFactory.java属于持久层相关的程序,这里就不贴出来了,读者可根据自己需要选择不同的持久层框架,在本程序中只要实现查询用户的功能就可以了

?

读书人网 >编程

热点推荐