案例1:
账号自动登录:
1.思想
使用Filter、cookie、session 步骤:
首先建立基本的登录逻辑,就是连接上数据库可以进行简单的登录;
项目架构:
com.itheima.daoimp
|--UserDaoimp
com.itheima.domain
|--User
com.itheima.filter
|--AutoLoginFilter
|--Ucodeing 统一编码处理过滤器
com.itheima.web.servlet
|--UserLoginservlet
com.itheima.utils
|--JdbcUtils
|--MyBeanUtils 核心jar:
mysql-connector-java-5.1.22-bin.jar //mysql连接jar
mchange-commons-java-0.2.3.jar //依赖包
commons-logging-1.1.1.jar //第三方log包,依赖包---log4j.jar
commons-dbutils-1.4.jar //jdbc封装工具类
commons-beanutils-1.8.3.jar //bean封装工具类
c3p0-0.9.2-pre5.jar //c3p0 数据库依赖包 c3p0-config.xml //数据库连接池配置文件
(一)简单的不进行阐述:直接上主要逻辑地方
1.UserLoginservlet中进行登录判断,如果登录成功则,将从数据库查询出来的beanuser
存储到session中
2.判断V(视图层)是否点击了,记住密码复选框按钮。如果点击了
将用户名和密码进行存储Cookie持久化处理
cookie.setMaxAge(60*60*24); //一天
cookie.setpath("/")
respond.addCookie(); (二) |建立过滤器 AutoLoginFilter,进行登录的逻辑判断
1.首先判断session中是否存在user对象
1.1 User loginUser = (User) req.getSession().getAttribute("Loginuser");
1.2 如过存在(loginUser!=null) 则过滤器进行放行 chain.doFilter(); return;
1.3 判断cookie中是否有值,(用户是否点击了记住密码)
/**
* 判断cookie中是否有值
*/
String autoLogin = null;
Cookie currentCookie = null;
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie oldLogin : cookies) {
if ("loginUser".equals(oldLogin.getName())) {
// 得到目标cookie
autoLogin = oldLogin.getValue();
// 拿到了之前的cookie
currentCookie = oldLogin;
break;
}
}
} 1.4 如果cookie中没有存在值 (autoLogin==null) chain.doFilter()----return;
1.5 如果读取到了值则进行处理,设置登录逻辑 /**
* 如果cookie中有值 进行处理
*/ String username = auto[0];
String password = auto[1]; User user = new User(username, password);
User reuser = new Userservice().find(user); 1.6判断逻辑,如果的用户登录过之后。cookie记住了之前的cookie信息,但是在登录之前user信息密码改了
。导致无法登录,之前的cookie信息,无效,但是还保存在内存中,持久化。
那么我们需要进行清理无效的cookie 所以,进行清除。
if (loginUser == null) {
//清楚无用的cookie
currentCookie.setMaxAge(0);
currentCookie.setPath("/");
res.addCookie(currentCookie);
chain.doFilter(request, response); return;
} 1.7
// 登录
req.getSession().setAttribute("Loginuser", reuser);
chain.doFilter(request, response);