1. 程式人生 > >JSP實現網頁的自動登入(session+cookie)實現

JSP實現網頁的自動登入(session+cookie)實現

1、session的作用

  使用者用瀏覽器訪問web伺服器時,會為每個使用者建立一個session(會話),session在使用者關閉瀏覽器之前都是有效的,所以我們可以在session中儲存使用者的一些資訊,以供使用。這裡我們用session儲存使用者的賬號名稱,以表示使用者已經登入,可以直接訪問後臺頁面。

2、cookie的作用

  cookie是客戶端儲存的一些少量資料,每次使用者通過瀏覽器訪問web伺服器時,cookie可以通過request一起傳送至伺服器端,這裡我們使用cookie儲存使用者的賬號密碼,以便實現自動登入功能。

說明:實現過程分為兩個頁面

  1. login.jsp 是前臺登入介面分別有賬號、密碼輸入區
    ,以及一個是否自動登入的複選框,一個選擇儲存時長的下拉列表框,如下圖所示:
    在這裡插入圖片描述
  2. mypage.jsp是登入後的顯示介面,有一個登出按鈕,以便使用者登出。
    在這裡插入圖片描述

3、流程

  • 使用者訪問login.jsp進行第一次登入,對應的servlet將提交的使用者名稱與密碼和資料庫中的記錄進行匹配,如果:
    • 匹配失敗(要考慮使用者名稱和密碼為空的情況),則返回login.jsp進行再次登入,並且報告錯誤資訊(記住提交URL引數中的中文需要用URLEncoder進行編碼,不然會亂碼)
    • 匹配成功 (cookie是儲存在客戶端的,程式中進行配置之後一定需要用response.addCookies將cookie新增至response從而發回客戶端瀏覽器)
      • 如果選擇了未自動登入,此時從request中取出原來的cookies,將有效時間設為0,表示不再進行自動登入。
      • 如果選擇了自動登入,那麼就要建立兩個新的cookie,一個儲存username,一個儲存passwd(安全的做法是用MD5等加密演算法加密後儲存),並根據選擇的有效時間設定cookie的有效時間
      • 之後用reque.getsession.setAttribute()設定username屬性表示使用者已經登入,最後將頁面重定向至mypage.jsp

程式碼如下所示:

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // TODO Auto-generated method stub String command= request.getParameter("command"); //這裡是使用者登入的介面,需要處理邏輯關係,考慮 if(command.equals("login")) { //1、沒有輸入使用者名稱 2、使用者名稱錯誤 3、密碼錯誤 String username = request.getParameter("username"); String passwd = request.getParameter("passwd"); //如果未輸入使用者名稱 if(username.equals("")||passwd.equals("")) { System.out.println("未輸入使用者名稱"); String error_msg = "請輸入使用者名稱和密碼"; String error =URLEncoder.encode(error_msg, "utf-8"); response.setCharacterEncoding("utf-8"); response.sendRedirect("/MyDBtest/login.jsp?error="+error); } //對使用者名稱進行查詢 else { String real_passwd = loginChecker.getPasswd(username); //沒有此使用者 if(real_passwd.equals("")) { System.out.println("沒有此使用者"); String error_msg = "沒有此使用者,請重新輸入使用者名稱"; String error =URLEncoder.encode(error_msg, "utf-8"); response.setCharacterEncoding("utf-8"); response.sendRedirect("/MyDBtest/login.jsp?error="+error); } //查詢成功 檢查使用者是否設定自動登入,如果是則傳送cookies else if(real_passwd.equals(passwd)) { //設定session username屬性表示使用者已經登入 request.getSession().setAttribute("username", username); //檢查使用者是否選擇自動登入 //如果選擇了自動登入,則需要儲存cookies if("on".equals(request.getParameter("autologin"))) { int saveTime = Integer.parseInt(request.getParameter("maxage")); saveTime =24*60*60*saveTime; Cookie user_cookie = new Cookie("username", username); Cookie passwd_cookie = new Cookie("passwd", passwd); user_cookie.setMaxAge(saveTime); passwd_cookie.setMaxAge(saveTime); response.addCookie(user_cookie); response.addCookie(passwd_cookie); } //如果沒有選擇自動登入 else { Cookie[] cookies = request.getCookies(); for(Cookie cookie:cookies) { System.out.println("刪除 cookie"); if(cookie.getName().equals("username")) { cookie.setMaxAge(0); response.addCookie(cookie); //新增生成的新的cookie } else if(cookie.getName().equals("passwd")) { cookie.setMaxAge(0); response.addCookie(cookie); //新增生成的新的cookie } } } //重定向到後臺介面 response.sendRedirect("/MyDBtest/mypage.jsp"); } //密碼錯誤 else { System.out.println("密碼錯誤"); String error_msg = "密碼錯誤,請重新輸入密碼"; String error =URLEncoder.encode(error_msg, "utf-8"); response.setCharacterEncoding("utf-8"); response.sendRedirect("/MyDBtest/login.jsp?error="+error); } } } else if(command.equals("deleteCookies")) { //使用者主動登出,那麼不用再儲存Cookies Cookie[] cookies = request.getCookies(); for(Cookie cookie:cookies) { if(cookie.getName().equals("username")) { cookie.setMaxAge(0); response.addCookie(cookie); //設定失效 } else if(cookie.getName().equals("passwd")) { cookie.setMaxAge(0); response.addCookie(cookie); //設定失效 } } //重定向到登入介面 request.getSession().removeAttribute("username"); response.sendRedirect("/MyDBtest/login.jsp"); } } }
  • 對於訪問mypage.jsp,步驟如下:
    • 首先檢查session是否有username屬性,如果存在那麼可以直接訪問mypage.jsp,若不存在則進行下一步判斷
    • 取出request中的cookie(考慮為空的情況),取出使用者名稱和密碼,與資料庫中記錄進行匹配,若匹配成功,則設定session的username屬性,表示已經登入成功,然後跳轉至mypage.jsp
    • 若與資料庫匹配失敗或者cookie為空,那麼可將頁面重定向至錯誤頁面,提示使用者進行登入後才能訪問。

不難想到,應該為 mypage.jsp設定一個過濾器,每次訪問該頁面,先由過濾器完成上述流程,過濾器配置如下:

  <filter>
  	<filter-name>LoginFilter</filter-name>
  	<filter-class>Filter.LoginFilter</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>LoginFilter</filter-name>
  	<url-pattern>/mypage.jsp</url-pattern>
  </filter-mapping>

過濾器程式碼如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		
		//訪問 mypage 頁面前需要經過此過濾器
		//System.out.println("進入到後臺登入過濾器");
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		
		

		//這裡說明使用者未登入,那麼獲取cookies並驗證是否能登入
		if(req.getSession().getAttribute("username")==null )
		{
			
			System.out.println("進入到後臺登入過濾器");
			Cookie[] cookies = req.getCookies();
			String username=null;
			String passwd=null;
			if(cookies!=null)
			{
				for(Cookie cookie:cookies)
				{
					if(cookie.getName().equals("username"))
					{
						username = cookie.getValue();
					}
					else if(cookie.getName().equals("passwd"))
					{
						passwd =cookie.getValue();
					}
				}
			}
			if(username!=null&&passwd!=null)
			{
				//匹配資料中的使用者名稱以及密碼
				//匹配成功則設定登入,否則退出登入
				if(loginChecker.getPasswd(username).equals(passwd))
                      req.getSession().setAttribute("username", username);
			}
			
		}
		
		
		
		// pass the request along the filter chain
		chain.doFilter(req, res);
	}

mypage.jsp頁面還有一個登出按鈕,使用者登出後,servlet應該主動刪除使用者的cookie資訊。