SpringMVC記住密碼功能
阿新 • • 發佈:2019-01-03
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);
}