做网站前端用户登录时需要有个下次自动登录的功能。看了看各大网站都有这种功能。
问题描述:用户登录网站时,一般有个checkbox让用户选择是否可以下次自动登录。选择后,即使用户关闭浏览器,下次再访问这个网站时直接就登录了,不需要用户名和密码。

主要使用cookie。cookie是web服务器存放在客户端的一个文件,主要用来记录用户浏览网站信息的。它主要有两个功能:一个是记录用户信息,下次自动登录的。另一个是记录跟踪统计用户浏览网页的习惯(浏览过哪些网站?停留时间,利用这个可以做访问量统计),我们主要用到第一个功能。配合代码讲解:

核心类:UserCookieUtil

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import net.cloudsun.base.entity.User;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;public class UserCookieUtil {// 保存cookie的cookieName
private final static String cookieDomainName = "项目名";   //自己随便定义
// 加密cookie时的网站自定码
private final static String webKey = "项目名";   //自己随便定义
// 设置cookie有效期是两个星期,根据需要自定义
private final static long cookieMaxAge = 60 * 60 * 24 * 7 * 2;// 保存Cookie到客户端
// 传递进来的user对象中封装了在登陆时填写的用户名与密码
public static void saveCookie(User user, HttpServletResponse response) {
// cookie的有效期至(到哪一天)
long validTime = System.currentTimeMillis() + (cookieMaxAge * 1000);
// MD5加密用户详细信息(其实就是把当前用户加密一下,后面判断是否是同一个用户)
String cookieValueWithMd5 = getMD5(user.getUserName() + ":"+ user.getPassWord() + ":" + validTime + ":" + webKey);
// 将要被保存的完整的Cookie值
String cookieValue = user.getUserName() + ":" + validTime +":"+cookieValueWithMd5;
// 再一次对Cookie的值进行BASE64编码
String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes()));
// 开始保存Cookie(cookie是网站名和值)
Cookie cookie = new Cookie(cookieDomainName, cookieValueBase64);
// 存两年(这个值应该大于或等于validTime)
cookie.setMaxAge(60 * 60 * 24 * 365 * 2);
// cookie有效路径是网站根目录
cookie.setPath("/");
// 向客户端写入
response.addCookie(cookie);
}// 用户注销时,清除Cookie
public static void clearCookie(HttpServletResponse response) {//创建一个空cookie添加,覆盖原来的达到清除目的
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) {
e2.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();
}
}

在用户登录的方法里保存cookie值。等用户选中下次自动登录并且本次登录成功后调用一下上面类的保存方法。

下次当用户在访问该网站时可以用拦截器(我用的是拦截器)拦截路径判断一下cookie是否存有该网站的user对象:有就自动登录。

import java.util.HashSet;
import java.util.Set;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.cloudsun.base.entity.User;
import net.cloudsun.base.service.UserService;
import net.cloudsun.util.UserCookieUtil;
import net.cloudsun.util.WebKeys;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.itextpdf.text.pdf.codec.Base64;public class PowerInterceptor extends HandlerInterceptorAdapter{private final static String cookieDomainName = "项目名";   //自己随便定义,跟上面一致
@Autowired
private UserService userService;
private static Set excludeUrl=null;
{
excludeUrl=new HashSet();
excludeUrl.add("/personal");//拦截路径中包含该词的地址
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HttpSession session=request.getSession(true);
User user=(User) session.getAttribute(WebKeys.USER_KEY);
String url=request.getRequestURI().toString();//判断用户是否登录,一般是都没登录的
if(user==null){Cookie[] cookies = request.getCookies();//取cookie值,这里还有其他网站的if(cookies!=null){String cookieValue = null;//下面是找到本项目的cookiefor (int i = 0; i < cookies.length; i++) {if(cookieDomainName.equals(cookies[i].getName())){cookieValue = cookies[i].getValue();break;}}//如果cookieValue为空 说明用户上次没有选择“记住下次登录”执行其他if(cookieValue==null){if(url.contains("personal")){                      response.sendRedirect(request.getContextPath()+"/loginInfo");return false;}}else{// 先得到的CookieValue进行Base64解码String cookieValueAfterDecode = new String(Base64.decode(cookieValue),"utf-8");// 对解码后的值进行分拆,得到一个数组,如果数组长度不为3,就是非法登陆String cookieValues[] = cookieValueAfterDecode.split(":");if(cookieValues.length!=3){ response.sendRedirect(request.getContextPath()+"/loginInfo");return false;}// 判断是否在有效期内,过期就删除Cookielong validTimeInCookie = new Long(cookieValues[1]);if (validTimeInCookie < System.currentTimeMillis()) {// 删除CookieUserCookieUtil.clearCookie(response); response.sendRedirect(request.getContextPath()+"/loginInfo");return false;}// 取出cookie中的用户名,并到数据库中检查这个用户名,String username = cookieValues[0];User temp = userService.findByName(username);// 如果user返回不为空,就取出密码,使用用户名+密码+有效时间+ webSiteKey进行MD5加密。与前面设置的进行比较,看是否是同一个用户if(temp!=null){String md5ValueInCookie = cookieValues[2];String md5ValueFromUser = UserCookieUtil.getMD5(temp.getUserName() + ":" + temp.getPassWord() + ":" + validTimeInCookie + ":" + cookieDomainName);// 将结果与Cookie中的MD5码相比较,如果相同,写入Session,自动登陆成功,并继续用户请求if (md5ValueFromUser.equals(md5ValueInCookie)) {session.setAttribute(WebKeys.USER_KEY, temp);
response.sendRedirect(request.getContextPath()+"/loginInfo");return false;}}}
}
}else{
if(url.contains("loginInfo")||url.contains("login")){
response.sendRedirect(request.getContextPath()+"/");
return false;
}
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
super.afterCompletion(request, response, handler, ex);
}
}

这样完成了我们想要的功能。。。。

Cookie-网站登录-下次自动登录相关推荐

  1. php中实现记住密码下次自动登录的例子

    做网站的时候经常会碰到要实现记住密码,下次自动登录,一周内免登陆,一个月内免登陆这种需求.这种功能一般都是通过cookie来实现的.本篇文章将简单说一下如何使用php实现该需求的.当然实现该需求的方法 ...

  2. vue 记住密码下次自动登录

    <span><input type="checkBox" name="adviceCheck" id="adviceCheck&qu ...

  3. python 自动登录网站_python实现网站用户名密码自动登录功能

    一.概述 公司需要通过网页用户认证登录实现上网,网络设备判断当前帐号12小时没有没上网将会自动断开帐号上网,每天早上上班第一件事就是打开用户认证网页输入. 用户名与密码,有时候要家里通过teamvie ...

  4. yii2教程-登录与自动登录机制解析

    简介 yii2的自动登录的原理很简单.主要就是利用cookie来实现的,在第一次登录的时候,如果登录成功并且选中了下次自动登录,那么就会把用户的认证信息保存到cookie中,cookie的有效期为1年 ...

  5. 带你一步一步实现验证码登录和自动登录

    文章目录 1.实现最简单的登录 2.过滤器处理中文乱码 3.编写最简单前端页面 4.编写验证码servlet 5.修改前端页面,添加验证码和自动登录按钮 6.实现自动登录 7.前端脚本编写:读取coo ...

  6. Winform开发框架之系统重新登录、自动登录实现

    在业务系统的操作过程中,有时候,用户需要切换用户进行重新登录,这种情况有时候是因为一个人管理多个用户账号,希望通过不同的账号登录进行管理不同的资料,另一种情况是酒店的换班操作,另一个人接替前面的人进行 ...

  7. 如何使用cookie信息,完成自动登录

    在做爬虫任务的时候,我们常常会遇到很多网页必须登录后,才可以开放某些页面.所以登录是爬取网页的第一步.但是,通过post表单(包含用户名和密码)的方法,对于那些不需要输入比较复杂的验证码的网页,可以使 ...

  8. java如何记住登录状态_Spring security实现记住我下次自动登录功能过程详解

    一.原理分析 第一次登陆时,如果用户勾选了readme选项,登陆成功后springsecurity会生成一个cookie返回给浏览器端,浏览器下次访问时如果携带了这个cookie,springsecu ...

  9. 间隔一段时间重复自动登录网站、定时自动登录网站的软件 —— 定时执行专家,无需复杂编程,简单配置即可使用

    常常有网友在网上发帖求助,想找一个定时自动登录网页(网站)的软件,大致需求如下: 1.打开网页 → 2.填写用户名.密码 → 3.点击登录按钮 → 4.登录成功 另外,还有诸如:要求间隔是每3个小时自 ...

最新文章

  1. 3分钟了解dubbo服务调试管理实用命令
  2. Spark创建RDD的四种方式(一):从集合(内存)中创建 RDD代码示例
  3. 对话智能新高度:全面解读百度开放域对话模型PLATO
  4. form表单提交之前判断
  5. 罗汉塔最少步骤_如何以最少的步骤压缩和密码保护文件?
  6. 2018/7/16-纪中某C组题【jzoj4024,jzoj4025,jzoj2136,jzoj2137】
  7. 质性研究工具_质性研究【001】
  8. 【转】C++学习三 模板类出错总结(Missing template arguments before ‘L‘)
  9. 使用Kubernetes和Docker将Spring Boot与MongoDB作为容器部署
  10. Docker初级选手(一)
  11. numpy 中的 broadcasting(广播)机制
  12. 二分图最大匹配(最大流)
  13. 测井储层参数预测+人工智能方法
  14. weblogic10.3.6安装漏洞补丁
  15. 计算机办公软件基础知识题库,办公软件基础知识试题--题库.doc
  16. 盗火:硅谷、海豹突击队和疯狂科学家如何变革我们的工作和生活
  17. 三星nfc添加门禁卡实测有效_今天才知道!iPhone手机还能变成门禁卡,60秒就能实现...
  18. 用C语言图形库画一个红色爱心
  19. 理解CTP/XTP柜台对接
  20. 记录用matlab APP中matlab coder的简单步骤

热门文章

  1. 思科收购OpenDNS以提升Security Everywhere2015
  2. 动态生成的dom为什么绑定事件会失效,以及如何解决
  3. 在uniapp使用微信插件获取不到回调数据问题解决
  4. 神经网络与卷积神经网络,神经网络层数的确定
  5. linux有哪些高级语言编译器,程序语言,操作系统,编译器三者之间有何关系?...
  6. 中国大学 MOOC 课程Python语言程序设计 (第11期)测试答案(1-5周)
  7. 【数据处理】Python,matplotlib 如何画柱状图?如何画各种类型的柱状图?柱子宽度设置;设置X轴刻度用label显示;设置柱子距离x轴的高度;设置柱体颜色;设置柱体描边;并列、多条柱状图
  8. 计算机动画电影英语翻译,英语翻译_推荐!最适合练口语的10部动画电影_沪江英语...
  9. java 简易购物车
  10. mysql类型转换及小数点保留问题(cast函数)