最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中使用Cookie實(shí)現(xiàn)記住登錄的示例代碼

 更新時(shí)間:2020年07月02日 10:00:56   作者:Asurplus、  
這篇文章主要介紹了SpringBoot中使用Cookie實(shí)現(xiàn)記住登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

最近在做項(xiàng)目,甲方提出每次登錄都要輸入密碼,會(huì)很麻煩,要求實(shí)現(xiàn)一個(gè)記住登錄狀態(tài)的功能,于是便使用 Cookie 實(shí)現(xiàn)該功能

一、Cookie 簡(jiǎn)介

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

其實(shí) Cookie 就是一個(gè)鍵和一個(gè)值構(gòu)成的,隨著服務(wù)器端的響應(yīng)發(fā)送給客戶端瀏覽器。然后客戶端瀏覽器會(huì)把 Cookie 保存起來(lái),當(dāng)下一次再訪問(wèn)服務(wù)器時(shí)把 Cookie 再發(fā)送給服務(wù)器。

1、Cookie 是 HTTP 協(xié)議的規(guī)范之一,它是服務(wù)器和客戶端之間傳輸?shù)男?shù)據(jù)
2、首先由服務(wù)器通過(guò)響應(yīng)頭把 Cookie 傳輸給客戶端,客戶端會(huì)將 Cookie 保存起來(lái)
3、當(dāng)客戶端再次請(qǐng)求同一服務(wù)器時(shí),客戶端會(huì)在請(qǐng)求頭中添加該服務(wù)器保存的 Cookie,發(fā)送給服務(wù)器
4、Cookie 就是服務(wù)器保存在客戶端的數(shù)據(jù)
5、Cookie 就是一個(gè)鍵值對(duì)

二、Cookie 使用

1、創(chuàng)建 Cookie

// Cookie 為鍵值對(duì)數(shù)據(jù)格式
Cookie cookie_username = new Cookie("cookie_username", username);

2、設(shè)置 Cookie 持久時(shí)間

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

3、設(shè)置 Cookie 共享路徑

// 表示當(dāng)前項(xiàng)目下都攜帶這個(gè)cookie
cookie_username.setPath(request.getContextPath());

4、向客戶端發(fā)送 Cookie

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

5、銷毀 Cookie

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

三、進(jìn)入正題

上面我們已經(jīng)了解了 Cookie 是什么,并且知道了 Cookie 的創(chuàng)建以及銷毀的方法,下面,我們就使用 Cookie 實(shí)現(xiàn)記住登錄狀態(tài)的功能,整個(gè)項(xiàng)目基于 SpringBoot 實(shí)現(xiàn)

1、注冊(cè)攔截器

/**
* 注冊(cè)攔截器
*/
@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);
  }
}

我們攔截了所有的請(qǐng)求路徑,放開(kāi)了 api、wechat 等請(qǐng)求路徑

這里可能會(huì)有一個(gè)疑問(wèn),為什么不放開(kāi)請(qǐng)求登錄界面的 api 請(qǐng)求路徑呢,原因是我們攔截登錄請(qǐng)求,當(dāng)我們請(qǐng)求登錄界面時(shí),我們已經(jīng)登錄過(guò),那么我們就無(wú)需進(jìn)入登錄界面,直接到主界面

我們使用了自定義的一個(gè)登錄攔截:LoginInterceptor,在第二步我們會(huì)詳細(xì)講解其中的實(shí)現(xiàn)原理

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();
    // 沒(méi)有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里面沒(méi)有包含用戶的一些登錄信息,則重定向到登錄界面
    if (StringUtils.isEmpty(cookie_username)) {
      response.sendRedirect(request.getContextPath() + "/login");
      return false;
    }
    // 獲取HttpSession對(duì)象
    HttpSession session = request.getSession();
    // 獲取我們登錄后存在session中的用戶信息,如果為空,表示session已經(jīng)過(guò)期
    Object obj = session.getAttribute(Const.SYSTEM_USER_SESSION);
    if (null == obj) {
			// 根據(jù)用戶登錄賬號(hào)獲取數(shù)據(jù)庫(kù)中的用戶信息
    	UserInfo dbUser = dao.getUserInfoByAccount(cookie_username);
      // 將用戶保存到session中
      session.setAttribute(Const.SYSTEM_USER_SESSION, dbUser);
    }
    // 已經(jīng)登錄
    return true;
  }
}

3、登錄請(qǐng)求

控制層

/**
 * 執(zhí)行登錄
 */
 @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();
 }

業(yè)務(wù)層

/**
 * 執(zhí)行登錄
 */
public JSONObject doLogin(String username, String password, HttpSession session, HttpServletRequest request, HttpServletResponse response) {
	// 最終返回的對(duì)象
  JSONObject res = new JSONObject();
  res.put("code", 0);
  if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
    res.put("msg", "請(qǐng)輸入手機(jī)號(hào)或密碼");
    return res;
  }
  UserInfo dbUser = dao.getUserInfoByAccount(username);
  if (null == dbUser) {
    res.put("msg", "該賬號(hào)不存在,請(qǐng)檢查后重試");
    return res;
  }
  // 驗(yàn)證密碼是否正確
  String newPassword = PasswordUtils.getMd5(password, username, dbUser.getSalt());
  if (!newPassword.equals(dbUser.getPassword())) {
    res.put("msg", "手機(jī)號(hào)或密碼錯(cuò)誤,請(qǐng)檢查后重試");
    return res;
  }
  // 判斷賬戶狀態(tài)
  if (1 != dbUser.getStatus()) {
    res.put("msg", "該賬號(hào)已被凍結(jié),請(qǐng)聯(lián)系管理員");
    return res;
  }
  // 將登錄用戶信息保存到session中
  session.setAttribute(Const.SYSTEM_USER_SESSION, dbUser);
  // 保存cookie,實(shí)現(xiàn)自動(dòng)登錄
  Cookie cookie_username = new Cookie("cookie_username", username);
  // 設(shè)置cookie的持久化時(shí)間,30天
  cookie_username.setMaxAge(30 * 24 * 60 * 60);
  // 設(shè)置為當(dāng)前項(xiàng)目下都攜帶這個(gè)cookie
  cookie_username.setPath(request.getContextPath());
  // 向客戶端發(fā)送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,實(shí)現(xiàn)自動(dòng)登錄
  Cookie cookie_username = new Cookie("cookie_username", "");
  // 設(shè)置cookie的持久化時(shí)間,0
  cookie_username.setMaxAge(0);
  // 設(shè)置為當(dāng)前項(xiàng)目下都攜帶這個(gè)cookie
  cookie_username.setPath(request.getContextPath());
  // 向客戶端發(fā)送cookie
  response.addCookie(cookie_username);
  return "login";
}

注銷登錄時(shí),我們需要?jiǎng)h除 session 里面的用戶信息,刪除 cookie 里面的用戶信息,然后請(qǐng)求到登錄界面

四、總結(jié)

以上就是 SpringBoot 中使用 Cookie 實(shí)現(xiàn)記住登錄功能,在項(xiàng)目中還算是比較實(shí)用的功能,希望能對(duì)正在閱讀的你一點(diǎn)點(diǎn)幫助和啟發(fā),更多相關(guān)SpringBoot Cookie記住登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java數(shù)組的定義與使用

    Java數(shù)組的定義與使用

    數(shù)組是有序的元素序列,若將有限個(gè)類型相同的變量的集合命名,那么這個(gè)名稱為數(shù)組名。本文通過(guò)代碼示例詳細(xì)介紹了Java數(shù)組的定義和使用,對(duì)學(xué)習(xí)或工作有一定的幫助,需要的小伙伴歡迎閱讀
    2023-04-04
  • Spring Boot 各種回滾操作實(shí)戰(zhàn)教程(自動(dòng)回滾、手動(dòng)回滾、部分回滾)

    Spring Boot 各種回滾操作實(shí)戰(zhàn)教程(自動(dòng)回滾、手動(dòng)回滾、部分回滾)

    這篇文章主要介紹了Spring Boot 各種回滾操作實(shí)戰(zhàn)教程(自動(dòng)回滾、手動(dòng)回滾、部分回滾),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • IDEA如何切換數(shù)據(jù)庫(kù)版本mysql5或mysql8

    IDEA如何切換數(shù)據(jù)庫(kù)版本mysql5或mysql8

    本文介紹了如何將IntelliJ IDEA從MySQL5切換到MySQL8的詳細(xì)步驟,包括下載MySQL8、安裝、配置、停止舊服務(wù)、啟動(dòng)新服務(wù)以及更改密碼等
    2025-01-01
  • Springboot實(shí)現(xiàn)TLS雙向認(rèn)證的方法

    Springboot實(shí)現(xiàn)TLS雙向認(rèn)證的方法

    本文介紹了使用keytool生成和管理自簽名CA證書(shū)、服務(wù)器證書(shū)和客戶端證書(shū)的方法,適合Java生態(tài)系統(tǒng),通過(guò)配置信任庫(kù)和服務(wù)器/客戶端配置,實(shí)現(xiàn)了Spring Boot中的TLS雙向認(rèn)證,感興趣的朋友一起看看吧
    2025-02-02
  • Java中的HashSet、LinkedHashSet集合解析

    Java中的HashSet、LinkedHashSet集合解析

    這篇文章主要介紹了Java中的HashSet、LinkedHashSet集合解析,與HashSet不同的是,LinkedHashSet在內(nèi)部使用了一個(gè)雙向鏈表來(lái)維護(hù)元素的順序,因此它可以保持元素的插入順序,這使得LinkedHashSet在需要保持元素順序的場(chǎng)景下非常有用,需要的朋友可以參考下
    2023-11-11
  • shell腳本運(yùn)行java程序jar的方法

    shell腳本運(yùn)行java程序jar的方法

    本篇文章主要介紹了shell腳本運(yùn)行java程序jar的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Java8新日期時(shí)間API的20個(gè)使用示例

    Java8新日期時(shí)間API的20個(gè)使用示例

    這篇文章主要介紹了Java8新日期時(shí)間API的20個(gè)使用示例,為了學(xué)習(xí)Java 8的這個(gè)新庫(kù),這里我創(chuàng)建了20個(gè)以任務(wù)為導(dǎo)向的例子,需要的朋友可以參考下
    2015-03-03
  • springboot使用swagger-ui 2.10.5 有關(guān)版本更新帶來(lái)的問(wèn)題小結(jié)

    springboot使用swagger-ui 2.10.5 有關(guān)版本更新帶來(lái)的問(wèn)題小結(jié)

    這篇文章主要介紹了springboot使用swagger-ui 2.10.5 有關(guān)版本更新帶來(lái)的問(wèn)題小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Spring中的aware接口詳情

    Spring中的aware接口詳情

    這篇文章主要介紹了Spring中的aware接口詳情,Spring中有很多繼承于aware中的接口,這些接口到底是做什么用到的,下面我們就一起來(lái)看看吧,文章詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • mybatis-generator-gui根據(jù)需求改動(dòng)示例

    mybatis-generator-gui根據(jù)需求改動(dòng)示例

    這篇文章主要為大家介紹了mybatis-generator-gui根據(jù)需求改動(dòng)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09

最新評(píng)論

随州市| 徐闻县| 山丹县| 安福县| 黔江区| 竹溪县| 邹城市| 桐梓县| 宜章县| 宁夏| 盐亭县| 榆中县| 东平县| 天镇县| 丰都县| 沙河市| 绵阳市| 榆社县| 博白县| 靖边县| 栾城县| 乐安县| 和政县| 来安县| 荣昌县| 梧州市| 伊宁市| 芷江| 通州市| 信宜市| 金溪县| 鄂托克前旗| 樟树市| 枣强县| 墨脱县| 苍溪县| 德安县| 靖宇县| 康马县| 如东县| 从化市|