1. 程式人生 > >SpringMVC記住密碼功能

SpringMVC記住密碼功能

CookieTool(Cookie幫助類):

package com.utcsoft.common.cookie;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieTool {

	/**
	* 設定cookie(介面方法)
	* @author 劉鵬
	* @param response
	* @param name  cookie名字
	* @param value cookie值
	* @param maxAge cookie生命週期  以秒為單位
	*/
	public static void addCookie(HttpServletResponse response,String name,String value,int maxAge){
		Cookie cookie = new Cookie(name,value);
		cookie.setPath("/");
		if(maxAge>0){  
			cookie.setMaxAge(maxAge);
		}
		response.addCookie(cookie);
		}
	
	/**
	* 根據名字獲取cookie(介面方法)
	* @author 劉鵬
	* @param request
	* @param name cookie名字
	* @return
	*/
	public static Cookie getCookieByName(HttpServletRequest request,String name){
		Map<String,Cookie> cookieMap = ReadCookieMap(request);
		if(cookieMap.containsKey(name)){
		  Cookie cookie = (Cookie)cookieMap.get(name);
		  return cookie;
		}else{
		  return null;
		} 
		}
	
	/**
	* 將cookie封裝到Map裡面(非介面方法)
	* @author 劉鵬
	* @param request
	* @return
	*/
	private static Map<String,Cookie> ReadCookieMap(HttpServletRequest request){ 
	Map<String,Cookie> cookieMap = new HashMap<String,Cookie>();
	Cookie[] cookies = request.getCookies();
	if(null!=cookies){
	  for(Cookie cookie : cookies){
	   cookieMap.put(cookie.getName(), cookie);
	  }
	}
	return cookieMap;
	}
	
	
}

AuthorizedInterceptor(攔截器):

package com.utcsoft.common.interceptor;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.utcsoft.common.cookie.CookieTool;
import com.utcsoft.pcapps.selfservice.dao.UtcUsersDao;
import com.utcsoft.pcapps.selfservice.entity.UtcUsers;

public class AuthorizedInterceptor implements HandlerInterceptor {

	/** 
     * 該方法也是需要當前對應的Interceptor的preHandle方法的返回值為true時才會執行。該方法將在整個請求完成之後,也就是DispatcherServlet渲染了檢視執行, 
     * 這個方法的主要作用是用於清理資源的,當然這個方法也只能在當前這個Interceptor的preHandle方法的返回值為true時才會執行。 
     */ 
	public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
	}

	 /** 
     * 這個方法只會在當前這個Interceptor的preHandle方法返回值為true的時候才會執行。postHandle是進行處理器攔截用的,它的執行時間是在處理器進行處理之 
     * 後,也就是在Controller的方法呼叫之後執行,但是它會在DispatcherServlet進行檢視的渲染之前執行,也就是說在這個方法中你可以對ModelAndView進行操 
     * 作。這個方法的鏈式結構跟正常訪問的方向是相反的,也就是說先宣告的Interceptor攔截器該方法反而會後呼叫,這跟Struts2裡面的攔截器的執行過程有點像, 
     * 只是Struts2裡面的intercept方法中要手動的呼叫ActionInvocation的invoke方法,Struts2中呼叫ActionInvocation的invoke方法就是呼叫下一個Interceptor 
     * 或者是呼叫action,然後要在Interceptor之前呼叫的內容都寫在呼叫invoke之前,要在Interceptor之後呼叫的內容都寫在呼叫invoke方法之後。 
     */  
	public void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler, ModelAndView modelAndView) throws Exception {
	}

	 /** 
     * preHandle方法是進行處理器攔截用的,顧名思義,該方法將在Controller處理之前進行呼叫,SpringMVC中的Interceptor攔截器是鏈式的,可以同時存在 
     * 多個Interceptor,然後SpringMVC會根據宣告的前後順序一個接一個的執行,而且所有的Interceptor中的preHandle方法都會在 
     * Controller方法呼叫之前呼叫。SpringMVC的這種Interceptor鏈式結構也是可以進行中斷的,這種中斷方式是令preHandle的返 
     * 回值為false,當preHandle的返回值為false的時候整個請求就結束了。 
     */  
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
		String uri = request.getRequestURI();
		//登陸請求不攔截
        /*if(uri.indexOf("checkUser.do") != -1){
        	return true;
        }*/
       
      //設定不攔截的物件
        String[] noFilters = new String[] {"logOn","index","supplier","innerChart"};  //對登入本身的頁面以及業務不攔截
        boolean beFilter = true; 
        for (String s : noFilters) {  
            if (uri.indexOf(s) != -1) {  
                beFilter = false;  
                break;  
            }  
        }
        
   if (beFilter==true) {//除了不攔截的物件以外
		String path = request.getContextPath();
		String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
	/*
	注意:每次重新啟動瀏覽器會重新啟動一個sessionId和Cookie,之前設定的session會因為sessionId的變化而取不到,所以會出現使用者明明已經登入,但是重開瀏覽器又需要登入.
		流程:
		1、使用者選擇記住密碼:取出cookie中的使用者名稱和密碼查詢,如果此使用者已不存在,則清除cookie中的值,如果存在則判斷使用者是否重新登入,如果未重新登入則將cookie中使用者資訊設定到session中,如果使用者重新登入了則判斷登入使用者是否與cookie中使用者一致,一致則將cookie中使用者資訊設定到session中,不一致則將當前登入使用者的資訊設定到session中。
		      	將使用者資訊放入session中是為了(通過cookie中的使用者名稱密碼可以得到使用者資訊):
		      		1、重開瀏覽器的時候如果已經登入的使用者可以直接進入
					2、防止使用者直接將執行方法的連線拷貝進位址列,而方法中又需要在session中取使用者資訊的錯誤
		2、使用者未選記住密碼:判斷session中是否存在使用者資訊,如果存在,則true,如果不存在則返回登入頁面
	*/
			Cookie cokLoginName = CookieTool.getCookieByName(request, "loginName");
			Cookie cokLoginPwd = CookieTool.getCookieByName(request, "loginPwd");
			//如果前面的人登入勾選了記住密碼,cookie中存在上一個人的資訊
			if (cokLoginName != null && cokLoginPwd != null && cokLoginName.getValue() != "" && cokLoginPwd.getValue() != "") {
				String loginName = cokLoginName.getValue();
				String loginPwd = cokLoginPwd.getValue();
				
				// 檢查到客戶端儲存了使用者的密碼,進行該賬戶的驗證
				UtcUsersDao usersDao = new UtcUsersDao();
				UtcUsers users = usersDao.findByNameAndPwd(loginName, loginPwd);
				
				//如果此人已經被管理員刪除
				if (users == null) {
					CookieTool.addCookie(response, "loginName", null, 0); // 清除Cookie
					CookieTool.addCookie(response, "loginPwd", null, 0); // 清除Cookie
					try {
						response.sendRedirect(basePath + "self/logOn.do");
						return false;
					} catch (IOException e) {
						e.printStackTrace();
					}
					request.getSession().setAttribute("errorInfo", "請登入!");
				}
				//如果存在此人
				else {
					UtcUsers utcUsers = (UtcUsers)request.getSession().getAttribute("utcUsers");
					if (utcUsers==null) {//如果未登入而直接拷貝位址列進入頁面
						request.getSession().setAttribute("utcUsers", users);
					}else {//使用者登入後
						if (utcUsers.getUsername().equals(users.getUsername())) {//如果當前登入人與cookie中資訊一致
							request.getSession().setAttribute("utcUsers", users);
						}else {//如果當前登入人與cookie中資訊不一致
							request.getSession().setAttribute("utcUsers", utcUsers);
						}
					}
				}
			}
			//如果cookie中沒有內容,即未勾選記住密碼,或者是退出後清除了cookie
			else{
				UtcUsers u = (UtcUsers)request.getSession().getAttribute("utcUsers");
				if (u==null) {//如果未登入
					response.sendRedirect(basePath + "self/logOn.do");
					 return false;
				}else {//如果已經登入
					//執行下一步
				}
			}
			
			/******退出的時候記得清除cookie中的內容,如果使用者已經登入********/
		
   }
		return true;
	}

}



登入驗證的方法:

/**
	 * 描述:登入驗證
	 * @param request
	 * @param response
	 * @return
	 * @throws IOException
	 */
	@RequestMapping(value="/index")
	public String index(HttpServletRequest httpRequest,HttpServletResponse httpResponse) throws IOException{
		String user_name = httpRequest.getParameter("user_name");
		String user_pwd = httpRequest.getParameter("user_pwd");
		String str = null;
		UtcUsersDao usersDao = new UtcUsersDao();
		UtcUsers users = usersDao.findByNameAndPwd(user_name,user_pwd);
		if(users==null){//登入驗證失敗
			logger.info("登入失敗");
			httpRequest.getSession().setAttribute("errorInfo","使用者名稱或密碼錯誤,請重新登入!");
			String path = httpRequest.getContextPath();
			String basePath = httpRequest.getScheme() + "://"+ httpRequest.getServerName() + ":" + httpRequest.getServerPort()+ path + "/";
			httpResponse.sendRedirect(basePath+"self/logOn.do");
		}else if ("10".equals(users.getUserrole())) {
			int  loginMaxAge = 30*24*60*60;   //定義賬戶密碼的生命週期,這裡是一個月。單位為秒
			String rememberPwd = httpRequest.getParameter("rememberPwd")==null?"":httpRequest.getParameter("rememberPwd").toString();
			if ("rememberPwd".equals(rememberPwd)) {
				CookieTool.addCookie(httpResponse , "loginName" , user_name , loginMaxAge); //將姓名加入到cookie中
			    CookieTool.addCookie(httpResponse , "loginPwd" , user_pwd , loginMaxAge);   //將密碼加入到cookie中
			}
			httpRequest.getSession().setAttribute("utcUsers", users);
			str = "/Administrator";
		}else {
			int  loginMaxAge = 30*24*60*60;   //定義賬戶密碼的生命週期,這裡是一個月。單位為秒
			String rememberPwd = httpRequest.getParameter("rememberPwd")==null?"":httpRequest.getParameter("rememberPwd").toString();
			if ("rememberPwd".equals(rememberPwd)) {
				CookieTool.addCookie(httpResponse , "loginName" , user_name , loginMaxAge); //將姓名加入到cookie中
			    CookieTool.addCookie(httpResponse , "loginPwd" , user_pwd , loginMaxAge);   //將密碼加入到cookie中
			}
			//將UtcUsers放到session中
			httpRequest.getSession().setAttribute("utcUsers", users);
			str = "self/index";
		}
		return str;
	}

點選退出系統按鈕的時候一定要記得清除cookie值()

/**返回登入頁面的中轉方法,用於清除cookie中內容,不要在登入方法中清除,因為首次登入時候進入登入方法cookie是不需要清除的
	 * @author liupeng
	 * @param request
	 * @param response
	 * @return
	 * @throws UnknownHostException
	 */
	@RequestMapping(value="/logOnTransit")
	public void logOnTransit(HttpServletRequest request,HttpServletResponse response) throws Exception{
		CookieTool.addCookie(response, "loginName", null, 0); // 清除Cookie
		CookieTool.addCookie(response, "loginPwd", null, 0); // 清除Cookie
		
		String path = request.getContextPath();
		String basePath = request.getScheme() + "://"
				+ request.getServerName() + ":" + request.getServerPort()
				+ path + "/";
		String finalPath = basePath+"self/logOn.do";
		response.sendRedirect(finalPath);
		
	}