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);
- }