中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Cookie使用過濾器如何實現客戶訪問登錄功能

發布時間:2020-10-16 15:37:15 來源:億速云 閱讀:240 作者:小新 欄目:編程語言

這篇文章主要介紹了Cookie使用過濾器如何實現客戶訪問登錄功能,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

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);// 刪除密碼cookie
response.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使用過濾器如何實現客戶訪問登錄功能內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安达市| 仪陇县| 民县| 遵义市| 利津县| 滕州市| 东丰县| 博野县| 无为县| 潞西市| 门源| 利津县| 射洪县| 四子王旗| 邵武市| 长葛市| 明溪县| 张家界市| 千阳县| 利辛县| 资讯| 营山县| 塔河县| 三门峡市| 邹城市| 翼城县| 舒城县| 阳高县| 岚皋县| 扬中市| 洞口县| 廊坊市| 油尖旺区| 武夷山市| 永年县| 宁夏| 潞西市| 辛集市| 保靖县| 大理市| 禄劝|