案例:自动登陆

需求分析: 

环境准备:

1、搭建数据库

2、 准备页面

登陆页面:

body>
	<form method="post" action="LoginServlet">
		账号:<input type="text" name="username" /><br> 
		密码:<input type="password" name="password" /><br> 
			<input type="checkbox" name="auto_login" />自动登陆<br> 
			<input type="submit" value="登陆" />
	</form>
</body>

登录成功以后进入index.jsp页面

<body>
	这是首页,
	<c:if test="${not empty userBean}">
	欢迎您,${userBean.username }
	</c:if>
	<c:if test="${empty userBean}">
	您好,请登录!
	</c:if>
</body>

Servlet代码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	try {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String autoLogin = request.getParameter("auto_login");
			
		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 + "#" + password);
				cookie.setMaxAge(60*60*24*7);//7天有效期
				cookie.setPath("/AutoLogin");
				response.addCookie(cookie);
			}
			//登陆成功,进入首页
			request.getSession().setAttribute("userBean", userBean);
			response.sendRedirect("index.jsp");
		}else {
			//不成功
			request.getRequestDispatcher("login.jsp").forward(request, response);
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

过滤器代码

>  过滤器的核心不是完成拦截不给 , 还是放行显示。 它的核心是在放行之前,帮用户完成登录的功能。 

* 实现思路:

1)先判断session是否有效, 如果有效,就不用取cookie了,直接放行。

2) 如果session失效了,那么就取 cookie。

    (1) 没有cookie  放行 

    (2) 有cookie 

            >取出来cookie的值,然后完成登录

            >把这个用户的值存储到session中

            > 放行。

@Override
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
		throws IOException, ServletException {
	try {
		HttpServletRequest request = (HttpServletRequest) req;
		//1、先判断,现在session中还有没有那个userBean
		UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
		//还有,有效
		if (userBean != null) {
			chain.doFilter(request, response);
		} else {
			//代表session失效
			//2、看cookie
			//来请求的时候,先从请求里面取出cookie,但是cookie里面有很多key-value
			Cookie[] cookies = request.getCookies();
			//从一堆的cookie中找出我们以前给浏览器发的那个cookie
			Cookie cookie = CookieUtil.findCookie(cookies, "auto_login");
			//第一次来
			if (cookie == null) {
				chain.doFilter(request, response);
			} else {
				//不是第一次
				String value = cookie.getValue();
				String username = value.split("#")[0];
				String password = value.split("#")[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 (Exception e) {
		e.printStackTrace();
		chain.doFilter(req, response);
	}
}

补充:

BeanUtils的使用

添加jar包:commons-beanutils-1.8.3.jar、commons-logging-1.1.1.jar

> BeanUtils.populate(bean, map); 

//注册自己的日期转换器
ConvertUtils.register(new MyDateConverter(), Date.class);

//转化数据
Map map = request.getParameterMap();
UserBean bean = new UserBean();

转化map中的数据,放置到bean对象身上
BeanUtils.populate(bean, map);    

猜你喜欢

转载自blog.csdn.net/HYN205/article/details/83822219