亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

基于Cookie使用過濾器實現客戶每次訪問只登錄一次

2024-07-10 13:32:24
字體:
來源:轉載
供稿:網友

相信大家在各大網站都會遇到,登錄時,在登錄框出現下次免登陸/一個月免登陸的類似選項,本文就是講解如何實現,在這記錄一下,也算是做個備忘錄合集,如果文中有錯,歡迎大家指出

為啥說自登陸一次呢,因為當訪問某個頁面時,如果第一次自動登錄失敗時,你下次刷新訪問時還再次走自動登錄流程,就會出現死循環。

本文代碼示例框架為Spring MVC,下面就講解實現該功能的需要掌握哪些知識:cookies與過濾器

1.cookies

何為Cookies:Cookies為 Web 應用程序保存用戶相關信息提供了一種有用的方法。例如,當用戶訪問您的站點時,您可以利用 Cookie 保存用戶首選項或其他信息,這樣,當用戶下次再訪問您的站點時,應用程序就可以檢索以前保存的信息。

我們看一下是如何保存cookies和如何刪除cookies

保存cookies

String newUserName = null;try {  newUserName = URLEncoder.encode(username, "UTF-8");//把用戶名轉碼,防止用戶名是中文,cookies保存中文取出會亂碼} catch (UnsupportedEncodingException e) {  e.printStackTrace();}Cookie nameCookie = new Cookie("username", newUserName);String pwdMd5Cook = MD5Util.MD5(Pwd);Cookie pwdCookie = new Cookie("pwd", pwdMd5Cook);// 保存加密后的密碼nameCookie.setMaxAge(60 * 60 * 24 * 365);// 用戶名保存一年pwdCookie.setMaxAge(60 * 60 * 24 * 30);// 密碼保存30天// 發送Cookie信息到瀏覽器response.addCookie(nameCookie);response.addCookie(pwdCookie);

刪除cookies,刪除很簡單,但值得注意的時,刪除cookies,跟保存cookies一定要在同一個控制層,不然會找不到保存的cookies,導致刪除不了

Cookie cookie = new Cookie("pwd", null);cookie.setMaxAge(0);// 刪除密碼cookieresponse.addCookie(cookie);

2.Filter-過濾器

Filter也稱之為過濾器,它是Servlet技術中最實用的技術,Web開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態圖片文件或靜態 html 文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息等一些高級功能。

實現方法:繼承Filter接口,并實現其doFilter方法。在web.xml文件中對編寫的filter類進行注冊,并設置它所能攔截的資源

<filter>指定一個過濾器。<filter-name>用于為過濾器指定一個名字,該元素的內容不能為空。<filter-class>元素用于指定過濾器的完整的限定類名。<init-param>元素用于為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數。<filter-mapping>元素用于設置一個 Filter 所負責攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑<filter-name>子元素用于設置filter的注冊名稱。該值必須是在<filter>元素中聲明過的過濾器的名字<url-pattern>設置 filter 所攔截的請求路徑(過濾器關聯的URL樣式)<servlet-name>指定過濾器所攔截的Servlet名稱。<filter>  <filter-name>suicaiFilter</filter-name>  <filter-class>com.suicai.filter.suicaiFilter</filter-class></filter><filter-mapping>  <filter-name>suicaiFilter</filter-name>  <url-pattern>/*</url-pattern></filter-mapping>

下面看一下實際應用代碼:

public class suicaiFilter implements Filter {  @Override  public void destroy() {  }  @Override  public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {    HttpServletRequest req=(HttpServletRequest)request;    HttpServletResponse res=(HttpServletResponse)response;    HttpSession session = req.getSession();    String requestURI = req.getRequestURI();    String param = req.getQueryString();    String url = req.getServletPath();    if(param!=null){      url = url+"?"+param;    }    if(requestURI.contains("js") || requestURI.contains("css") || requestURI.contains("images")){      //不過濾css,js,images等靜態資源      chain.doFilter(request, response);    }else if(requestURI.contains("/info/")||requestURI.contains("/gys/")){      //過濾前臺訪問頁面,跟前臺個人中心(供應商后臺),自動登錄一次,登錄不成功不進行操作,個人中心登錄不成功,則跳到登錄頁面      ProviderInfo providerInfo = (ProviderInfo) session.getAttribute("providerInfo_gys");      String IsAutomaticLogin = (String) session.getAttribute("IsAutomaticLogin");//是否已經走過自動登錄流程標識      if(requestURI.contains("/info/") && !requestURI.contains("/login")){        //訪問門戶等不需要必須登錄的(登錄除外),只嘗試登錄一次,如果不成功,不進行操作        if(providerInfo==null && IsAutomaticLogin == null){          req.getSession().setAttribute("goURL", url);          res.sendRedirect(req.getContextPath() + "/common/automaticLogin");        }else if(providerInfo==null && IsAutomaticLogin != null ){          chain.doFilter(request, response);        }else{          chain.doFilter(request, response);        }      }else if(requestURI.contains("/gys/")){//訪問個人中心,自登陸一次,不成功跳轉到登錄頁面        if(providerInfo==null && IsAutomaticLogin == null){          req.getSession().setAttribute("goURL", url);          res.sendRedirect(req.getContextPath() + "/common/automaticLogin");        }else if(providerInfo==null && IsAutomaticLogin != null ){          session.setAttribute("redirectUrl", url);          res.sendRedirect(req.getContextPath() + "/login.jsp?redirectUrl="+url);        }else{          chain.doFilter(request, response);        }      }else{        chain.doFilter(request, response);      }    }else{      //不過濾      chain.doFilter(request, response);    }  }  @Override  public void init(FilterConfig arg0) throws ServletException {  }}

從代碼中可知,需要一個是否已經自動登錄過的標識(IsAutomaticLogin),該標識是在走自動登錄時(不管成不成功)保存起來的

3.結合上面提供知識,下面為整體代碼展示,如發現不對地方,歡迎大家指出

@Controller@RequestMapping("/common")public class CommonController{  /**   * 自動登錄方法   * @param request   * @param response   * @param username   * @param pwd   * @param ProviderInfo 供應商賬戶信息model   * @return   */  @RequestMapping("/automaticLogin")  public String automaticLogin(HttpServletRequest request,ServletResponse response,@CookieValue(value = "username", required = false) String username,@CookieValue(value = "pwd", required = false) String pwd,ProviderInfo ProviderInfo) {    // 保存需求登錄前的鏈接    String goURL = (String) session.getAttribute("goURL");    if (username == null) {//cookies中沒有用戶名,肯定不需要自動登錄      session.setAttribute("IsAutomaticLogin", "0");      return "redirect:" + goURL;    } else {      try {        username = URLDecoder.decode(username, "UTF-8");//轉義,防止中文      } catch (UnsupportedEncodingException e) {        e.printStackTrace();      }    }    // cookie失效 session一定為空,因為登錄時,一定會把用戶名保存在cookie中    if ("".equals(username) || username == null) {// 使用session登錄不了,不進行任何操作,不在進入這個方法      session.setAttribute("IsAutomaticLogin", "0");      return "redirect:" + goURL;    } else {      // cookie中沒有密碼,判斷session為不為空,如果為空,說明沒有登錄,如果不為空,說明,用戶是選擇不記住密碼登錄(所以cookie中沒有密碼)      if ("".equals(pwd) || pwd == null) {        ProviderInfo customer1 = (ProviderInfo) session.getAttribute("providerInfo_gys");        if (customer1 == null) {// 使用session登錄不了,不進行任何操作,不在進入這個方法          session.setAttribute("IsAutomaticLogin", "0");          return "redirect:" + goURL;        } else {          // 已經登錄,不再進入這個方法          return "redirect:" + goURL;        }      } else {        // cookie中有密碼,判斷session為不為空,如果為空,說明沒有登錄,如果不為空,說明已經登錄        ProviderInfo customer1 = (ProviderInfo) session.getAttribute("providerInfo_gys");        if (customer1 == null) {// 當前沒有登錄,調用cookies中的用戶名跟密碼進行登錄          // 進行自動登錄操作,登錄成功后返回原來頁面          ProviderInfo customer3 = ValidateDate(username);          customer3.setPwd(pwd);          customer3.setAccountType(6);          ProviderInfo customer2 = infoService.login(customer3);//調用登錄方法          if (customer2 == null) {// 自動登錄失敗,不再進入這個方法            session.setAttribute("IsAutomaticLogin", "0");            return "redirect:" + goURL;          } else {            // 登陸成功保存客戶信息到session            session.setAttribute("providerInfo_gys",customer2);            return "redirect:" + goURL;          }        } else {          return "redirect:" + goURL;        }      }    }  }  /**   * 用戶登陸   * @param request   * @param response   * @param cus   * @return   */  @RequestMapping("/UserLogin")  @ResponseBody  public Map<String, Object> goLogin(HttpServletRequest request,HttpServletResponse response,@ModelAttribute("ProviderInfo") ProviderInfo cus) {    /*省略一些邏輯判斷*/    cus.setPwd(MD5Util.MD5(Pwd));    ProviderInfo providerInfo = infoService.login(cus);    Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();    if (providerInfo == null) {      // 登陸失敗,重新跳轉到登陸頁面      map.put("error", "密碼錯誤");      return map;    }else{      String newUserName = null;      if (remember_me.equals("1")) {// 有選擇一個月免登錄        try {          newUserName = URLEncoder.encode(username, "UTF-8");        } catch (UnsupportedEncodingException e) {          e.printStackTrace();        }        Cookie nameCookie = new Cookie("username", newUserName);        String pwdMd5Cook = MD5Util.MD5(Pwd);        Cookie pwdCookie = new Cookie("pwd", pwdMd5Cook);// 保存加密后的密碼+"create"        nameCookie.setMaxAge(60 * 60 * 24 * 365);// 用戶名保存一年        pwdCookie.setMaxAge(60 * 60 * 24 * 30);// 密碼保存30天        // 發送Cookie信息到瀏覽器        response.addCookie(nameCookie);        response.addCookie(pwdCookie);        session.setAttribute("IsAutomaticLogin",null);      }else{//沒有選擇,刪除上次可能已經選擇自動登錄時的密碼        Cookie[] cookies = request.getCookies();        if (null != cookies) {          for (Cookie cookie : cookies) {            cookieMap.put(cookie.getName(), cookie);          }        }        if (cookies != null) {          for (int i = 0; i < cookies.length; i++) {            if (cookieMap.containsKey("pwd")) {              Cookie cookie = new Cookie("pwd", null);              cookie.setMaxAge(0);// 刪除密碼cookie              response.addCookie(cookie);            }          }        }      }      // 登陸成功,保存當前user信息,保存客戶信息到session      map.put("ProviderInfo", providerInfo);      map.put("goURL", session.getAttribute("goURL"));      session.setAttribute("providerInfo_gys", providerInfo);      return map;    }else {      map.put("error", "該供應商賬號不存在");      return map;    }  }  /**   * 注銷   * @return   */  @RequestMapping("/logout")  public String logout(HttpServletResponse response) {    Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();    Cookie[] cookies = request.getCookies();    if (null != cookies) {      for (Cookie cookie : cookies) {        cookieMap.put(cookie.getName(), cookie);      }    }    if (cookies != null) {      for (int i = 0; i < cookies.length; i++) {        if (cookieMap.containsKey("pwd")) {          Cookie cookie = new Cookie("pwd", null);          cookie.setMaxAge(0);// 刪除密碼cookie          response.addCookie(cookie);        }      }    }    session.setAttribute("providerInfo_gys", null);    return "/index";  }}

以上所述是小編給大家介紹的基于Cookie使用過濾器實現客戶每次訪問只登錄一次,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久久久久久久久久| 国产精品99久久久久久久久| 亚洲自拍偷拍色图| 国产精品视频26uuu| 久久中国妇女中文字幕| 成人久久久久爱| 国内精久久久久久久久久人| 欧美色xxxx| 亚洲精品在线视频| 久久久久99精品久久久久| 激情亚洲一区二区三区四区| 久久精品国产一区| 北条麻妃久久精品| 亚洲天堂久久av| 久久人人爽人人爽人人片亚洲| 国产91在线高潮白浆在线观看| 国产亚洲精品激情久久| 九九热精品视频国产| 久久久久久噜噜噜久久久精品| 日韩av色在线| 日韩精品在线影院| 伊人男人综合视频网| 欧美激情欧美激情在线五月| 亚洲图中文字幕| 一区二区三区黄色| 国产精品都在这里| 夜色77av精品影院| 日韩在线观看免费高清| 亚洲第五色综合网| 国产精品劲爆视频| 国产日韩欧美一二三区| 亚洲欧美国产日韩天堂区| 欧美大胆a视频| 亚洲男人的天堂网站| 日本三级韩国三级久久| 久久国产精品久久国产精品| 亚洲精品永久免费精品| 在线日韩精品视频| 国产视频在线一区二区| 日韩av片免费在线观看| 亚洲加勒比久久88色综合| 6080yy精品一区二区三区| 国产精品一区二区三区在线播放| 亚洲第五色综合网| 亚洲成人精品在线| 午夜精品一区二区三区在线视频| 日韩最新中文字幕电影免费看| 欧洲美女免费图片一区| 亚洲国产福利在线| 亚洲free性xxxx护士hd| 日产日韩在线亚洲欧美| 亚洲欧美日韩区| 亚洲第一视频网站| 69av在线播放| 欧美韩国理论所午夜片917电影| 日韩欧美亚洲范冰冰与中字| 国产亚洲精品久久久久动| 久久亚洲精品国产亚洲老地址| 日韩电影免费在线观看| 2019亚洲男人天堂| 欧美在线一区二区三区四| 亚洲在线免费看| 日本国产高清不卡| 久久不射电影网| 日韩欧美在线视频日韩欧美在线视频| 亚洲国产女人aaa毛片在线| 国产一区二区在线免费| 日韩av在线网址| 亚洲国产精品美女| 国产美女直播视频一区| 69久久夜色精品国产69| 久久九九热免费视频| 国语自产精品视频在线看| 国产精品视频久久久久| 亚洲第一精品夜夜躁人人躁| 欧美又大又硬又粗bbbbb| 97超级碰碰碰久久久| 欧美激情亚洲国产| 这里只有精品丝袜| 日韩成人中文字幕| 日韩av网址在线观看| 亚洲一区二区久久| 色噜噜亚洲精品中文字幕| 在线免费观看羞羞视频一区二区| 日韩中文av在线| 中文字幕一区二区精品| 亚洲日韩第一页| 午夜精品在线观看| 亚洲国产精品字幕| 91免费综合在线| 欧美性猛交丰臀xxxxx网站| 成人性生交大片免费看小说| 一本色道久久综合亚洲精品小说| 日日狠狠久久偷偷四色综合免费| 久久久影视精品| 久久视频精品在线| 亚洲精品www久久久| 精品二区三区线观看| 国产91精品高潮白浆喷水| 日本久久中文字幕| 午夜免费在线观看精品视频| 亚洲男人第一av网站| 欧美亚洲第一区| 中文字幕亚洲综合久久| 日韩中文字幕网| 国产视频久久久| 日本视频久久久| 久久久久久久一区二区| 国产女人18毛片水18精品| 欧美丝袜美女中出在线| 米奇精品一区二区三区在线观看| 一本色道久久综合狠狠躁篇的优点| 国产91精品网站| 亚洲欧美日韩天堂| 一夜七次郎国产精品亚洲| 日韩av电影在线免费播放| 国产精品久久一| 精品国产依人香蕉在线精品| 97精品视频在线观看| 欧美华人在线视频| 久久精品视频在线播放| 久精品免费视频| 在线观看国产精品日韩av| 久久九九国产精品怡红院| 国产精品精品视频一区二区三区| 欧美日韩国产中文字幕| 国产噜噜噜噜噜久久久久久久久| 亚洲成人在线网| 欧美成人自拍视频| 日韩美女av在线| 国产精品一二区| 九九热r在线视频精品| 欧美国产视频日韩| 精品日韩中文字幕| 久久免费高清视频| 国产中文字幕日韩| 日韩美女写真福利在线观看| 成人在线观看视频网站| 国产丝袜一区视频在线观看| 欧美激情国产高清| 都市激情亚洲色图| 国产日韩在线亚洲字幕中文| 丁香五六月婷婷久久激情| 91网站免费观看| 国产精品久久久久一区二区| 欧美性猛交视频| 亚洲人成网站免费播放| 国产亚洲美女精品久久久| 国产精自产拍久久久久久蜜| 欧美自拍视频在线观看| 日韩在线观看免费高清完整版| 成人精品一区二区三区| 亚洲一品av免费观看| 成人性教育视频在线观看| 精品日本美女福利在线观看| www日韩欧美| 欧美日韩亚洲精品一区二区三区| 成人福利在线观看| 日韩精品中文字幕视频在线| 91精品免费视频| 欧美自拍视频在线观看| 欧美精品在线第一页| 久久中文久久字幕| 亚洲午夜未满十八勿入免费观看全集|