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

溫馨提示×

溫馨提示×

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

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

SpringBoot中使用Cookie實現記住登錄的方法

發布時間:2020-07-02 14:24:05 來源:億速云 閱讀:2459 作者:清晨 欄目:開發技術

這篇文章將為大家詳細講解有關SpringBoot中使用Cookie實現記住登錄的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

一、Cookie 簡介

Cookie,一種儲存在用戶本地終端上的數據,有時也用其復數形式 Cookies。類型為“小型文本文件”,是某些網站為了辨別用戶身份,進行 Session 跟蹤而儲存在用戶本地終端上的數據(通常經過加密),由用戶客戶端計算機暫時或永久保存的信息。

其實 Cookie 就是一個鍵和一個值構成的,隨著服務器端的響應發送給客戶端瀏覽器。然后客戶端瀏覽器會把 Cookie 保存起來,當下一次再訪問服務器時把 Cookie 再發送給服務器。

1、Cookie 是 HTTP 協議的規范之一,它是服務器和客戶端之間傳輸的小數據
2、首先由服務器通過響應頭把 Cookie 傳輸給客戶端,客戶端會將 Cookie 保存起來
3、當客戶端再次請求同一服務器時,客戶端會在請求頭中添加該服務器保存的 Cookie,發送給服務器
4、Cookie 就是服務器保存在客戶端的數據
5、Cookie 就是一個鍵值對

SpringBoot中使用Cookie實現記住登錄的方法

二、Cookie 使用

1、創建 Cookie

// Cookie 為鍵值對數據格式
Cookie cookie_username = new Cookie("cookie_username", username);

2、設置 Cookie 持久時間

// 即:過期時間,單位是:秒(s)
cookie_username.setMaxAge(30 * 24 * 60 * 60);

3、設置 Cookie 共享路徑

// 表示當前項目下都攜帶這個cookie
cookie_username.setPath(request.getContextPath());

4、向客戶端發送 Cookie

// 使用 HttpServletResponse 對象向客戶端發送 Cookie
response.addCookie(cookie_username);

5、銷毀 Cookie

// 根據 key 將 value 置空
Cookie cookie_username = new Cookie("cookie_username", "");
// 設置持久時間為0
cookie_username.setMaxAge(0);
// 設置共享路徑
cookie_username.setPath(request.getContextPath());
// 向客戶端發送 Cookie
response.addCookie(cookie_username);

三、進入正題

上面我們已經了解了 Cookie 是什么,并且知道了 Cookie 的創建以及銷毀的方法,下面,我們就使用 Cookie 實現記住登錄狀態的功能,整個項目基于 SpringBoot 實現

1、注冊攔截器

/**
* 注冊攔截器
*/
@Configuration
public class WebConfigurer implements WebMvcConfigurer {

  @Autowired
  private LoginInterceptor loginHandlerInterceptor;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    InterceptorRegistration ir = registry.addInterceptor(loginHandlerInterceptor);
    // 攔截路徑
    ir.addPathPatterns("/*");
    // 不攔截路徑
    List<String> irs = new ArrayList<String>();
    irs.add("/api/*");
    irs.add("/wechat/*");
    irs.add("/oauth");
    ir.excludePathPatterns(irs);
  }
}

我們攔截了所有的請求路徑,放開了 api、wechat 等請求路徑

這里可能會有一個疑問,為什么不放開請求登錄界面的 api 請求路徑呢,原因是我們攔截登錄請求,當我們請求登錄界面時,我們已經登錄過,那么我們就無需進入登錄界面,直接到主界面

我們使用了自定義的一個登錄攔截:LoginInterceptor,在第二步我們會詳細講解其中的實現原理

2、登錄攔截

/**
* 未登錄攔截器
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {

  @Autowired
  private LoginDao dao;

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // 獲得cookie
    Cookie[] cookies = request.getCookies();
    // 沒有cookie信息,則重定向到登錄界面
    if (null == cookies) {
      response.sendRedirect(request.getContextPath() + "/login");
      return false;
    }
    // 定義cookie_username,用戶的一些登錄信息,例如:用戶名,密碼等
    String cookie_username = null;
    // 獲取cookie里面的一些用戶信息
    for (Cookie item : cookies) {
      if ("cookie_username".equals(item.getName())) {
        cookie_username = item.getValue();
        break;
      }
    }
    // 如果cookie里面沒有包含用戶的一些登錄信息,則重定向到登錄界面
    if (StringUtils.isEmpty(cookie_username)) {
      response.sendRedirect(request.getContextPath() + "/login");
      return false;
    }
    // 獲取HttpSession對象
    HttpSession session = request.getSession();
    // 獲取我們登錄后存在session中的用戶信息,如果為空,表示session已經過期
    Object obj = session.getAttribute(Const.SYSTEM_USER_SESSION);
    if (null == obj) {
			// 根據用戶登錄賬號獲取數據庫中的用戶信息
    	UserInfo dbUser = dao.getUserInfoByAccount(cookie_username);
      // 將用戶保存到session中
      session.setAttribute(Const.SYSTEM_USER_SESSION, dbUser);
    }
    // 已經登錄
    return true;
  }
}

3、登錄請求

控制層

/**
 * 執行登錄
 */
 @PostMapping("login")
 @ResponseBody
 public String login(String username, String password, HttpSession session, HttpServletRequest request, HttpServletResponse response) {
   return service.doLogin(username.trim(), password.trim(), session, request, response).toJSONString();
 }

業務層

/**
 * 執行登錄
 */
public JSONObject doLogin(String username, String password, HttpSession session, HttpServletRequest request, HttpServletResponse response) {
	// 最終返回的對象
  JSONObject res = new JSONObject();
  res.put("code", 0);
  if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
    res.put("msg", "請輸入手機號或密碼");
    return res;
  }
  UserInfo dbUser = dao.getUserInfoByAccount(username);
  if (null == dbUser) {
    res.put("msg", "該賬號不存在,請檢查后重試");
    return res;
  }
  // 驗證密碼是否正確
  String newPassword = PasswordUtils.getMd5(password, username, dbUser.getSalt());
  if (!newPassword.equals(dbUser.getPassword())) {
    res.put("msg", "手機號或密碼錯誤,請檢查后重試");
    return res;
  }
  // 判斷賬戶狀態
  if (1 != dbUser.getStatus()) {
    res.put("msg", "該賬號已被凍結,請聯系管理員");
    return res;
  }
  // 將登錄用戶信息保存到session中
  session.setAttribute(Const.SYSTEM_USER_SESSION, dbUser);
  // 保存cookie,實現自動登錄
  Cookie cookie_username = new Cookie("cookie_username", username);
  // 設置cookie的持久化時間,30天
  cookie_username.setMaxAge(30 * 24 * 60 * 60);
  // 設置為當前項目下都攜帶這個cookie
  cookie_username.setPath(request.getContextPath());
  // 向客戶端發送cookie
  response.addCookie(cookie_username);
  res.put("code", 1);
  res.put("msg", "登錄成功");
  return res;
}

4、注銷登錄

/**
 * 退出登錄
 */
@RequestMapping(value = "logout")
public String logout(HttpSession session, HttpServletRequest request, HttpServletResponse response) {
  // 刪除session里面的用戶信息
  session.removeAttribute(Const.SYSTEM_USER_SESSION);
  // 保存cookie,實現自動登錄
  Cookie cookie_username = new Cookie("cookie_username", "");
  // 設置cookie的持久化時間,0
  cookie_username.setMaxAge(0);
  // 設置為當前項目下都攜帶這個cookie
  cookie_username.setPath(request.getContextPath());
  // 向客戶端發送cookie
  response.addCookie(cookie_username);
  return "login";
}

注銷登錄時,我們需要刪除 session 里面的用戶信息,刪除 cookie 里面的用戶信息,然后請求到登錄界面

關于SpringBoot中使用Cookie實現記住登錄的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

阿荣旗| 吉安县| 临桂县| 朝阳区| 高平市| 军事| 银川市| 沾益县| 平原县| 法库县| 崇信县| 南川市| 邳州市| 博客| 汝州市| 绥江县| 永城市| 溆浦县| 台南市| 云梦县| 内江市| 富平县| 镇宁| 板桥市| 北票市| 开化县| 济源市| 武冈市| 焦作市| 铅山县| 绥中县| 河西区| 宾川县| 永新县| 托克托县| 桃园市| 浦北县| 南开区| 内黄县| 杭锦旗| 邓州市|