自动登录功能——Filter、session、cookie

接着使用数据库连接池最后的  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>

过滤器的逻辑分析:

  1. 先判断session是否有效, 如果有效,就不用取cookie了,直接放行。
  2. 如果session失效了,那么就取 cookie。
    1. 没有cookie,表明是第一次登录,放行
    2. 有cookie ,表明登陆过,但session失效了,session失效的原因可能是过期,也可能是关闭了浏览器
      1. 取出来cookie的值,然后完成登录
      2. 把这个用户的值存储到session中,方便下次没有失效前使用
      3. 放行。

猜你喜欢

转载自blog.csdn.net/qq_38635681/article/details/88225336