色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:2日期:2023-05-07 18:16:58

最近在做項(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)過加密),由用戶客戶端計(jì)算機(jī)暫時(shí)或永久保存的信息。

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

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

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

二、Cookie 使用

1、創(chuàng)建 Cookie

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

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

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

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

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

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

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

5、銷毀 Cookie

// 根據(jù) key 將 value 置空Cookie cookie_username = new Cookie('cookie_username', '');// 設(shè)置持久時(shí)間為0cookie_username.setMaxAge(0);// 設(shè)置共享路徑cookie_username.setPath(request.getContextPath());// 向客戶端發(fā)送 Cookieresponse.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è)攔截器*/@Configurationpublic 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)求路徑,放開了 api、wechat 等請(qǐng)求路徑

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

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

2、登錄攔截

/*** 未登錄攔截器*/@Componentpublic 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對(duì)象 HttpSession session = request.getSession(); // 獲取我們登錄后存在session中的用戶信息,如果為空,表示session已經(jīng)過期 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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 日韩美视频网站 | 欧美日本在线一区二区三区 | 91福利精品老师国产自产在线 | 99视频在线观看视频 | 日本特级淫片免费 | 亚洲一区成人 | 精品国产三级a在线观看 | 99精品视频在线观看免费播放 | 在线亚洲自拍 | 日韩一级a毛片欧美一级 | 日本久久综合网 | 亚洲欧洲久久久精品 | 久久国产影视 | 91热久久免费精品99 | 精品日韩在线视频一区二区三区 | 亚洲区一区| 日本一级毛片在线看 | 国产亚洲一区在线 | 欧美日本一区二区三区 | 国产α片 | 欧美黄www免费 | 国产一区二区三区毛片 | 一区二区精品在线观看 | 可以看毛片的网址 | 香蕉久久夜色精品国产尤物 | 日本人一级毛片免费视频 | 国产精品亚洲精品一区二区三区 | 亚洲精品人成网在线播放影院 | 久久精品免费一区二区三区 | 精品国产v无码大片在线观看 | 成人网视频在线观看免费 | 久久久久久91香蕉国产 | 国产精品亚洲精品影院 | 国产精品国产精品国产三级普 | 日韩在线免费视频 | 亚洲精品影院久久久久久 | 国产91一区二区在线播放不卡 | 人人公开免费超级碰碰碰视频 | 手机看片亚洲 | 日韩欧美在线观看视频一区二区 | 美国三级网站 |