SpringBoot中使用Cookie實(shí)現(xiàn)記住登錄的示例代碼
最近在做項(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ì)

二、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è)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)求路徑,放開了 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、登錄攔截
/**
* 未登錄攔截器
*/
@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對(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ù)庫中的用戶信息
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)文章希望大家以后多多支持腳本之家!
- 爬蟲代理的cookie如何生成運(yùn)行
- Vue+element+cookie記住密碼功能的簡(jiǎn)單實(shí)現(xiàn)方法
- 在vue中使用cookie記住用戶上次選擇的實(shí)例(本次例子中為下拉框)
- 如何使用jQuery操作Cookies方法解析
- Vue axios 跨域請(qǐng)求無法帶上cookie的解決
- Springboot中登錄后關(guān)于cookie和session攔截問題的案例分析
- Selenium webdriver添加cookie實(shí)現(xiàn)過程詳解
- Python3爬蟲帶上cookie的實(shí)例代碼
- PHP如何獲取Cookie并實(shí)現(xiàn)模擬登錄
- 通過實(shí)例了解cookie機(jī)制特性及使用方法
相關(guān)文章
SpringMVC @RequestBody自動(dòng)轉(zhuǎn)json Http415錯(cuò)誤的解決
這篇文章主要介紹了SpringMVC @RequestBody自動(dòng)轉(zhuǎn)json Http415錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
解析分別用遞歸與循環(huán)的方式求斐波那契數(shù)列的實(shí)現(xiàn)方法
本篇文章是對(duì)分別用遞歸與循環(huán)的方式求斐波那契數(shù)列的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

