實現在這兩個功能,都需要用到coolie技術,將所需要的用戶名或者密碼帶到瀏覽器端,實現用戶名和密碼的記錄,然後完成所要的功能。
一、自動登錄功能
- 後臺的代碼
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;
}
}
}
}
- 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"> 記住用戶名