自己Cookie写的自动登录功能 包含BASE64 和MD5的使用

时间:2021-01-11 04:48:10

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&period;0自动登录功能的实现方法

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

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

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

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

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

  5. Vue&plus;Vuex 实现自动登录功能

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

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

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

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

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

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

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

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

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

随机推荐

  1. &lbrack;BS-07&rsqb; 创建和使用PCH File

    创建和使用PCH File 1.创建PCH File File - iOS Other - PCH File - PrefixHeader.pch 写法如下: #ifndef PrefixHeader ...

  2. 批处理命令 - for

    0.功能 Runs a specified command for each file in a set of files.对一组文件中的每一个文件执行某个特定命令. ---------------- ...

  3. Hadoop HDFS文件系统通过java FileSystem 实现上传下载等

    package linlintest; import java.io.File; import java.io.FileOutputStream; import java.io.IOException ...

  4. PHP邮箱验证是否有效

    今天一开电脑发现有人在我的主页给我乱留言,所以加了一个邮箱验证. 网上发现一个很巧妙的算法,分享一下: function checkmail($email){ $exp = "^[a-z'0 ...

  5. flask Django保存session区别

    '''Django中,session保存在服务端的数据库中,数据库中保存请求用户的所有数据,服务端数据中{'随机字符串':加密后的客户相关信息}请求完成后,把随机字符串作为值,返回给客户端,保存在客户 ...

  6. L273 NCAA

    On Friday, the system that prevents college athletes from being compensated for their labor (beyond ...

  7. 以太坊&lpar;Ethereum&rpar; - 节点时间未同步和区块同步失败案例分析

    背景 以太坊技术搭建的区块链网络,节点间需要保证时间一致,才能正常有序的发送交易和生成区块,使得众多节点共同维护分布式账本(区块数据+状态数据).但是,网络中节点的系统时间不一致回出现什么现象呢,我们 ...

  8. 理解if &lowbar;&lowbar;name&lowbar;&lowbar; &equals;&equals; &&num;39&semi;&lowbar;&lowbar;main&lowbar;&lowbar;&&num;39&semi;&colon;

    一开始没怎么注意这个语句,这两天在模拟知乎登陆时准备刨根问底了,先看两行代码片段 第一个例子:这是在login.py文件的一部分,其他我们忽略,只关注print()函数的内容 import time ...

  9. Python学习-12&period;Python的输入输出

    在Python中,输出使用print函数,之前用过了. 输入的话,则使用input函数. var = input() print('you input is' + var) 输入haha则将输出you ...

  10. Python全栈day28(类的装饰器)

    类是一个对象也可以像函数一样加装饰器 类的装饰器.py def deco(obj): print('======',obj) obj.x=1 obj.y=2 obj.z=3 return obj # ...