接着使用数据库连接池最后的 DBUtils和C3P0的结合使用——账户登录案例
1.导包增加
2.修改index.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:if test="${not empty userBean}">
欢迎您,${userBean.username}
</c:if>
<c:if test="${ empty userBean}">
您好,请登录!
</c:if>
</body>
</html>
3.修改LoginSevlet代码
try {
String username = request.getParameter("username");
String password = request.getParameter("password");
String autoLogin = request.getParameter("auto_login");
System.out.println(username+"="+password+"="+autoLogin);
UserBean user = new UserBean();
user.setUsername(username);
user.setPassword(password);
UserDao dao = new UserDaoImpl();
UserBean userBean = dao.login(user);
if(userBean != null) {
//页面提交上来的时候,是否选择了自动登录
if("on".equals(autoLogin)) {
//发送cookie给客户端
Cookie cookie = new Cookie("auto_login", username+"#bob#"+password);
cookie.setMaxAge(60*60*24*7);
cookie.setPath("/AutoLoginDemo1");
response.addCookie(cookie);
}
//成功了,进入首页
request.getSession().setAttribute("userBean", userBean);
response.sendRedirect("index.jsp");
}else {
//不成功
request.getRequestDispatcher("login.jsp").forward(request, response);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
4.添加过滤器代码
package com.bob.filter;
import java.io.IOException;
import java.sql.SQLException;
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 com.bob.dao.UserDao;
import com.bob.dao.UserDaoImpl;
import com.bob.domain.UserBean;
import com.bob.util.CookieUtil;
public class AutoLoginFilter implements Filter {
public void destroy() { }
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequest request;
request = (HttpServletRequest) req;
//先判断session中是否还有那个userbean
UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
if(userBean != null) {
//之前登陆过且session还在有效期内,放行
chain.doFilter(request, response);
}else {
//1.获取请求里面的cookie
Cookie[] cookies = request.getCookies();
//2.找到名字为auto_login的cookie
Cookie cookie = CookieUtil.findCookie(cookies, "auto_login");
if(cookie == null) {
//表明第一次登录
chain.doFilter(request, response);
}else {
//表明登陆过,但session失效了,session失效的原因可能是过期,也可能是关闭了浏览器
String value = cookie.getValue();
String username = value.split("#bob#")[0];
String password = value.split("#bob#")[1];
UserBean user = new UserBean();
user.setUsername(username);
user.setPassword(password);
UserDao dao = new UserDaoImpl();
userBean = dao.login(user);
//使用session存这个值到域中,方便下次没有过期前使用
request.getSession().setAttribute("userBean", userBean);
//放行
chain.doFilter(request, response);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//放行
chain.doFilter(req, response);
}
}
public void init(FilterConfig fConfig) throws ServletException {}
}
在web.xml中配置过滤器
<filter>
<display-name>AutoLoginFilter</display-name>
<filter-name>AutoLoginFilter</filter-name>
<filter-class>com.bob.filter.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AutoLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器的逻辑分析:
- 先判断session是否有效, 如果有效,就不用取cookie了,直接放行。
- 如果session失效了,那么就取 cookie。
- 没有cookie,表明是第一次登录,放行
- 有cookie ,表明登陆过,但session失效了,session失效的原因可能是过期,也可能是关闭了浏览器
- 取出来cookie的值,然后完成登录
- 把这个用户的值存储到session中,方便下次没有失效前使用
- 放行。