sql表

username  password字段

User类

有 id username password等字段

Service有一函数

 @Override

 public User findUser(String username)
{
return userDao.findUser(username);
}

实现

     @Override
public User findUser(String username) {
try {
return qr.query("select * from user where username=?", new BeanHandler<User>(User.class),username);
} catch (SQLException e) {
throw new DaoException(e);
}
}

Utils

WEBUtils.java

 package cn.itcast.util;

 import java.lang.reflect.InvocationTargetException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import sun.misc.BASE64Encoder; public class WebUtils { public static <T> T fillBean(HttpServletRequest request,
Class<T> clazz) {
try {
T t=clazz.newInstance();
BeanUtils.populate(t,request.getParameterMap());
return t;
} catch(Exception e) {
throw new RuntimeException(e);
}
} public static void addAutoLoginFunction(HttpServletRequest request,
HttpServletResponse response) { String username=request.getParameter("username");
String password=request.getParameter("password");
//把帐号BASE64加密 _ 密码双次md5加密, 所以比较的时候 数据库中密码取出md5加密再和这个比较 String encodeUsername=new BASE64Encoder().encode(username.getBytes());
String encodePassword=Md5Util.md5(password);
System.out.println("存入数据库 帐号:"+username);
System.out.println("存入数据库 密码:"+password);
System.out.println("存入Cookie 帐号:"+encodeUsername);
System.out.println("存入Cookie密码:"+encodePassword);
Cookie c=new Cookie("loginInfo",encodeUsername+"_"+encodePassword);
c.setMaxAge(10000);
c.setPath(request.getContextPath());
response.addCookie(c);
}
//删除Cookie
public static void removeAutoLoginCookie(HttpServletRequest request,
HttpServletResponse response) {
Cookie cs[]=request.getCookies();
if(cs!=null)
{
for(Cookie c:cs)
{
if(c.getName().equals("loginInfo"))
{
Cookie cookie=new Cookie("loginInfo",null);
cookie.setMaxAge(0);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
// c.setMaxAge(0);
// c.setPath(request.getContextPath());
System.out.println("删除Cookie");
return;
}
}
}
} }

MD5Util.java

 package cn.itcast.util;

 import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import sun.misc.BASE64Encoder; public class Md5Util {
public static String md5(String message){
try{
MessageDigest md = MessageDigest.getInstance("md5");
byte b[] = md.digest(message.getBytes());
return new BASE64Encoder().encode(b);
}catch(Exception e){
throw new RuntimeException(e);
}
}
}

Servlet中 由doGet()引出以下两个方法 operation=login   operation=logout

    private void logout(HttpServletRequest request, HttpServletResponse response) throws IOException {
//移除Cookie 去除自动登录功能
WebUtils.removeAutoLoginCookie(request,response);
request.getSession().invalidate();
response.sendRedirect(request.getContextPath());
} private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username=request.getParameter("username");
String password=request.getParameter("password");
BusinessService serviceDao=new BusinessServiceImpl();
password=Md5Util.md5(password);
User user=serviceDao.login(username,password);
if(null==user)
{
request.setAttribute("message", "用户名或者密码错误");
request.getRequestDispatcher("/client/message.jsp").forward(request, response);
}
else
{
request.getSession().setAttribute("user", user);
String autoLogin=request.getParameter("autologin");
if(null!=autoLogin)
{
//添加自动登录功能
WebUtils.addAutoLoginFunction(request,response);
}
response.sendRedirect(request.getContextPath());
}
}

filter过滤器中配置

 package cn.itcast.web.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 sun.misc.BASE64Decoder; import cn.itcast.domain.User;
import cn.itcast.service.BusinessService;
import cn.itcast.service.impl.BusinessServiceImpl;
import cn.itcast.util.Md5Util; public class AutoLoginFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
BusinessService bService=new BusinessServiceImpl();
HttpSession session = request.getSession();
User u = (User)session.getAttribute("user");
if(null==u)////只有没有登录时才自动登录,已经登录了就不需要了
{
System.out.println("自动登录开始执行");
//1、获取名称为loginInfo的cookie
Cookie loginInfoCookie=null;
Cookie cs[]=request.getCookies();
if(null!=cs)
{
for(Cookie c:cs)
{
if("loginInfo".equals(c.getName()))
{
loginInfoCookie=c;
break;
}
}
}
//2、有:取出cookie的值:用户名_加密的密码
if(null!=loginInfoCookie)
{
String usernamePassword=loginInfoCookie.getValue();
System.out.println("帐号密码整串:"+usernamePassword);
//3、拆出用户名和密码
String username=usernamePassword.split("\\_")[0];
String password=usernamePassword.split("\\_")[1];
//根据登录的时候 username password放入Cookie的原理
//username BASE64解密
username=new String(new BASE64Decoder().decodeBuffer(username));
System.out.println("Cookie的用户:"+username);
System.out.println("Cookie的密码:"+password);
User user=bService.findUser(username);
if(null!=user)
{
System.out.println("Cookie的用户:"+user.getUsername());
System.out.println("Cookie的密码:"+Md5Util.md5(user.getPassword()));
//4、再次验证用户名和密码是否正确(根据用户名查出密码,加密后再与cookie中的那个密码进行比对)
//将数据库查出的密码 md5加密和cookie中的密码相比
if(Md5Util.md5(user.getPassword()).equals(password))
{
//5、正确:得到用户对象,放到HttpSession中(自动登录)
session.setAttribute("user", user);
//自动登录搞定
System.out.println("自动登录完成");
}
}
}
}
//放行
chain.doFilter(request, response);
} @Override
public void destroy() { } }

web.xml中可以配置对指定的页面进行 自动登录的过滤器, 因为放到session中,所以不需要每个页面都过滤

url-pattern 配置 过滤地址

自己Cookie写的自动登录功能 包含BASE64 和MD5的使用的更多相关文章

  1. cookie理解与实践【实现简单登录以及自动登录功能】

    cookie理解 Cookie是由W3C组织提出,最早由netscape社区发展的一种机制 http是无状态协议.当某次连接中数据提交完,连接会关闭,再次访问时,浏览器与服务器需要重新建立新的连接: ...

  2. yii2.0自动登录功能的实现方法

    参考地址:http://www.kuitao8.com/20150518/3747.shtml 自动登录的原理很简单.主要就是利用cookie来实现的在第一次登录的时候,如果登录成功并且选中了下次自动 ...

  3. 二十 Filter&自动登录功能

    Filter过滤器 过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理.在中间就可以过滤,起到的是拦截的作用. 不仅仅作用于客户端请求,而且过滤服务器响应 作用: ...

  4. spring security实现记住我下次自动登录功能

    目录 spring security实现记住我下次自动登录功能 一.原理分析 二.实现方式 2.1 简单实现方式 2.2 数据库实现方式 三.区分是密码登录还是rememberme登录 spring ...

  5. Vue+Vuex 实现自动登录功能

    刚刚实现了Vue+Vuex的自动登录功能,在实现的时候遇到了一些问题,这里记录一下: 因为这个还不够完善,在写完下列代码后,又进行了补充,可以从https://www.cnblogs.com/xiao ...

  6. java代码实现自动登录功能

    通常我们登录某网站,会有选择保存几天,或者是几个星期不用登录,之后输入该网站地址无需登录直接进入主页面,那么这就叫做自动登录,怎么实现呢,下面我以一个小例子来演示一下 登录页面:login.jsp & ...

  7. JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码

    一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDi ...

  8. mvc框架下,怎样用cookie实现下次自动登录

    登录时有个下次自动登录的checkBox.点了它下次就可以自动登录了 具体流程我都晓得,就是细节的地方有些搞不定.我只要解决3个问题: (1)登录时如果点了checkbox,则在本机产生一个cooki ...

  9. html5本地存储数据,实现自动登录功能

    背景: 在项目中遇到一个需求:用户登录完之后,网站自动保存用户id存储在本地,在下次打开网页时,通过id判断是否要进行登录操作. 技术方案: 在HTML5中,本地存储是一个window的属性,包括lo ...

随机推荐

  1. 【DFS】【枚举】Gym - 101246G - Revolutionary Roads

    给你一张有向图,问你将任意一条边变成双向后,所能得到的最大强连通分量的大小. 缩点之后,预处理can(i,j)表示i能到j. 之后枚举每一条边(u,v),再枚举其他所有点t,如果can(u,t) &a ...

  2. 【树状数组逆序对】USACO.2011JAN-Above the median

    [题意] 给出一串数字,问中位数大于等于X的连续子串有几个.(这里如果有偶数个数,定义为偏大的那一个而非中间取平均) [思路] 下面的数据规模也小于原题,所以要改成__int64才行.没找到测试数据, ...

  3. 深入学习 History 对象管理浏览器会话历史

    History对象允许我们操作浏览器会话历史,即加载当前页面的标签页窗口或frame窗口的访问历史.之前有同学咨询我如何实现拦截用户跳转页面并强制用户返回首页后重新请求页面,于是有了本篇博客的主题,本 ...

  4. python修改和获取进程名字:setproctitle

    参考: https://pypi.org/project/setproctitle/

  5. iOS:时间格式化(标准时间转为时间戳、时间戳转为标准时间、时间戳转为日期)

    新建一个NSString(Time)分类,创建类方法实现时间的转换 .h文件 #import <Foundation/Foundation.h> @interface NSString ( ...

  6. glsl水包含倒影的实现(rtt) 【转】

    http://blog.sina.com.cn/s/blog_78ea87380101eixi.html 此文实现一个简单地水面倒影效果,通过rtt相机 获取倒影纹理, 水的基本实现方法(参考前一博文 ...

  7. 理解JS里的稀疏数组与密集数组

    一般来说,JavaScript中的数组是稀疏的. 什么是稀疏呢?稀疏也就是说,数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.本文解释了如何创建稀疏数组和不稀疏的数组. 1.稀疏数组 创 ...

  8. from表单实现无跳转上传文件,接收页面后台数据

    实现无跳转发送表单数据.文件,并能接收后台返回的数据. 主要技术要点: 1.form表单添加target属性,指定一个iframme的name:form表单提交后在iframe内嵌窗口接受响应,主页面 ...

  9. http://my.oschina.net/lenglingx/blog/205269

    http://my.oschina.net/lenglingx/blog/205269 http://www.2cto.com/os/201402/281465.html 单点登录原理: http:/ ...

  10. 【Web】Django OAuth invalid_grant error

    This can happen if the code is expired. They expire pretty quickly by default. You can look up your ...