1. 程式人生 > >案例:自動登陸

案例:自動登陸

需求分析: 

環境準備:

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);