1. 程式人生 > >java自動登入功能和記住使用者名稱功能

java自動登入功能和記住使用者名稱功能

實現在這兩個功能,都需要用到coolie技術,將所需要的使用者名稱或者密碼帶到瀏覽器端,實現使用者名稱和密碼的記錄,然後完成所要的功能。 一、自動登入功能

  1. 後臺的程式碼 1.1、後臺servlet中的程式碼
//1、判斷是否勾選了自動登入的複選框
            String autoLogin = request.getParameter("autoLogin");
            //自動登入
            if("autoLogin".equals(autoLogin)){
                //勾選了複選框 回寫一個帶有使用者名稱和密碼的cooke
                Cookie cookie = new Cookie("autoLogin", user.getUsername() + "#" + user.getPassword());
                //設定存活的時間
                cookie.setMaxAge(60*60*12*7);//設定7天
                //設定路徑
                cookie.setPath("/");
                //回寫cookie
                response.addCookie(cookie);

                response.sendRedirect(request.getContextPath()+"/index.jsp");
                return;
            }

1.2、 後臺filter中的程式碼

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        // 將reqeust,  先強轉
        HttpServletRequest request = (HttpServletRequest) req;

        // 判斷使用者是否已經登入, 如果已經登入,  直接放行
        User existUser = (User) request.getSession().getAttribute("user");
        if(existUser!=null){

            //進來, 則說明 已經登入,則 直接放行
            chain.doFilter(request,resp);
            return;
        }else{

            //說明沒有登入,  那麼就 幫助 使用者自動登入

            //獲得目標的 coookie
            Cookie[] cookies = request.getCookies();

            Cookie targetCookie = CookieUtils.findTargetCookie(cookies, "autoLogin");

            if(targetCookie==null){
                //進來,則說明根本都沒有帶 目標 cookie 過來, 那麼 不能 自動登入, 則
                // 直接放行
                chain.doFilter(request,resp);
                return;
            }else{
                // 進來,則說明找到了 目標名稱的cookie , 進一步獲得
                // username 和password

                // autologin   = zs#itheima#202cb962ac59075b964b07152d234b70
                String value = targetCookie.getValue();

                String username = value.split("#")[0];
                String password = value.split("#")[1];              
                System.out.println("username : " + username);
                System.out.println("password : " + password);

                //  還是要再次 查詢一下.
                UserService us = new UserServiceImpl();
                User loginUser = us.findUserPwd(username, password);
                if(loginUser!=null){
                   //則說明, 找到了, 意味著 帶過來的cookie 資訊是沒有問題的
                    // 幫助 使用者自動登入
                    //注:登陸成功的標誌是 session 域中有 user 物件 此處登入成功之後,將user物件存入到 session域中                    request.getSession().setAttribute("user",loginUser);
                    //放行
                    chain.doFilter(request,resp);
                    return;
                }else{
                    //說明 cookie的資訊有問題... 登入不了
                    //放行
                    chain.doFilter(request,resp);
                    return;
                }
            }
        }
    }
  1. 3、後臺工具類 util 中的程式碼
public class CookieUtils {

    /**
     *     呼叫這個 api ,可以從 cookies的陣列中找到 目標名稱的cookie 物件
     *
     * @param cookies . cookie的陣列
     * @param name  , 目標cookie的 name, 名稱
     * @return
     */
    public static Cookie findTargetCookie(Cookie[] cookies , String name){
        if(cookies==null){
            return null;
        }

        for (Cookie cookie: cookies ) {
            if(name.equals(cookie.getName())){

                //進來,則說明找到了 目標名稱的cookie物件
                return cookie;
            }
        }
        return null;
    }
}

二、記住使用者名稱功能 1.1. 後臺的程式碼

//獲取前臺傳過來的記住使用者名稱的input中的name的屬性
String remeber = request.getParameter("remeber");
            //回寫使用者名稱
            if("remeber".equals(remeber)){//當勾選的記住按鈕的時候
                System.out.println(remeber+"我是remeber");
                Cookie cookie = new Cookie("remeber", user.getUsername());
                //設定存貨時間
                cookie.setMaxAge(60*60*24*4);//存貨4天的時間
                //設定訪問的路徑
                cookie.setPath("/");
                //回寫cooki
                response.addCookie(cookie);
            }else {//當沒有記住勾選了按鈕的時候,清除cookie的資訊
                Cookie cookie = new Cookie("remeber", "");
                cookie.setMaxAge(0);
                cookie.setPath("/");
                response.addCookie(cookie);
            }

1.2 前臺的程式碼

 1.2.1 、JSP 的程式碼
<%  //java
		String username="";
		//或得瀏覽器中的cookie
		Cookie[] cookies=request.getCookies();
		if(cookies!=null&&cookies.length>0){
			//遍歷Cookie
			for(int i=0;i<cookies.length;i++){
				Cookie cookie=cookies[i];
				//此處類似與Map有name和value兩個欄位,name相等才賦值,並處理編碼問題
				if("remeber".equals(cookie.getName())){
					username=java.net.URLDecoder.decode(cookie.getValue(),"utf-8");
				}

			}
		}
		//將username儲存到session域中
		request.getSession().setAttribute("username",username);
	%>

 1.2.2 、html 的程式碼

<input type="checkbox" name="remeber" value="remeber"> 記住使用者名稱