自己Cookie写的自动登录功能 包含BASE64 和MD5的使用
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的使用的更多相关文章
- cookie理解与实践【实现简单登录以及自动登录功能】
cookie理解 Cookie是由W3C组织提出,最早由netscape社区发展的一种机制 http是无状态协议.当某次连接中数据提交完,连接会关闭,再次访问时,浏览器与服务器需要重新建立新的连接: ...
- yii2.0自动登录功能的实现方法
参考地址:http://www.kuitao8.com/20150518/3747.shtml 自动登录的原理很简单.主要就是利用cookie来实现的在第一次登录的时候,如果登录成功并且选中了下次自动 ...
- 二十 Filter&自动登录功能
Filter过滤器 过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理.在中间就可以过滤,起到的是拦截的作用. 不仅仅作用于客户端请求,而且过滤服务器响应 作用: ...
- spring security实现记住我下次自动登录功能
目录 spring security实现记住我下次自动登录功能 一.原理分析 二.实现方式 2.1 简单实现方式 2.2 数据库实现方式 三.区分是密码登录还是rememberme登录 spring ...
- Vue+Vuex 实现自动登录功能
刚刚实现了Vue+Vuex的自动登录功能,在实现的时候遇到了一些问题,这里记录一下: 因为这个还不够完善,在写完下列代码后,又进行了补充,可以从https://www.cnblogs.com/xiao ...
- java代码实现自动登录功能
通常我们登录某网站,会有选择保存几天,或者是几个星期不用登录,之后输入该网站地址无需登录直接进入主页面,那么这就叫做自动登录,怎么实现呢,下面我以一个小例子来演示一下 登录页面:login.jsp & ...
- JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码
一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDi ...
- mvc框架下,怎样用cookie实现下次自动登录
登录时有个下次自动登录的checkBox.点了它下次就可以自动登录了 具体流程我都晓得,就是细节的地方有些搞不定.我只要解决3个问题: (1)登录时如果点了checkbox,则在本机产生一个cooki ...
- html5本地存储数据,实现自动登录功能
背景: 在项目中遇到一个需求:用户登录完之后,网站自动保存用户id存储在本地,在下次打开网页时,通过id判断是否要进行登录操作. 技术方案: 在HTML5中,本地存储是一个window的属性,包括lo ...
随机推荐
- 【字符串哈希】【哈希表】Aizu - 1370 - Hidden Anagrams
给你两个4k长度的串,问你最长公共子串.两个子串相同被定义为所有字母的出现次数分别相同即可. 就枚举第一个串的所有子串,将字母出现的次数看作一个大数,进行哈希(双关键字),塞到哈希表里面.然后枚举第二 ...
- 【c++随手记】编程基础之输入输出
今天试了下noi oj的1.1节,随便总结一下. [cout左对齐右对齐的方法] #include<iostream> #include<cstdio> #include< ...
- [转]MySQL与Oracle 差异比较之一数据类型
数据类型 Oracle MySQL 1 NUMBER int / DECIMAL DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型:MYSQ ...
- iOS .a静态库的制作及使用
一.制作.a静态库 1.创建静态库工程,工程命名为BaseSDK,生成的.a文件名变成libBaseSDK.
- Ajax同步异步的区别
1,什么是Ajax Ajax: asynchronous javascript and xml (异步javascript和xml) 其是可以与服务器进行(异步/同步)交互的技术之一. Aja ...
- linux下的udev是干嘛的,能否说的通俗点
转:http://www.360doc.com/content/11/0415/21/1317564_109924863.shtml 早期的linux的/dev目录下有一大堆设备文件,不管你的主机上是 ...
- IDEA/Pycharm/Webstorm项目目录中的 Scratches and Consoles作用
临时的文件编辑环境,通过临时的编辑环境,你可以写一些文本内容或者一些代码片段. 参考:https://segmentfault.com/a/1190000014202363 https://www.w ...
- Ubuntu - 硬盘分区、格式化、自动挂载配置
Ubuntu系统的硬盘空间不够用了,需要增加新的硬盘扩容.将硬盘分区.格式化.自动挂载配置的整个过程记下来,备忘. 运行环境 | Enviroment Ubuntu 10.10 一.硬盘分区 | Ha ...
- oracle 10g函数大全--数值型函数
ABS(x) [功能]返回x的绝对值 [参数]x,数字型表达式 [返回]数字 [示例] select abs(100),abs(-100) from dual; sign(x) [功能]返回x的正负值 ...
- 从项目上一个子查询扩展学习开来:mysql的查询、子查询及连接查询
上面这样的数据,想要的结果是:如果matchResult为2的话,代表是黑名单.同一个softId,version,pcInfoId的代表是同一个软件,需要去重:同时,如果相同软件里面只要有一个mat ...