Java精品項目瑞吉外賣之登陸的完善與退出功能篇
上一篇:
後端登錄功能實現
一. 需求分析
員工登錄之後,頁面跳轉到後臺首頁(backend/index.html)此前會顯示用戶登錄的用戶名,點擊退出按鈕退出系統。
請求API:
說明 | 值 |
請求地址URL | employee/loginout |
請求參數 | 無 |
返回參數 | ({ "code": 1, "msg": null, "data": "退出成功", "map": {} } |
二.功能實現
隻需要清除session即可,在controller中添加如下代碼:
/** * 後管登出 * @param request * @return */ @PostMapping("/logout") public R<String> loginOut(HttpServletRequest request){ // 去除session request.getSession().removeAttribute("employee"); return R.success("退出成功"); }
三.功能測試
登錄成功後是有session記錄的:
點擊頁碼按鈕退出後session清除,並返回登錄頁面就表示成功瞭。
四. 登錄功能完善
4.1 問題分析
前面已經完成瞭登錄功能的開發,但會發現一個問題,就是員工不登錄情況下,依然能夠進入到目標頁面很顯然這並不是我們想看到的。
那如何實現呢?使用過濾器或者攔截器,在過濾器或者攔截器中判斷用戶是否是登錄狀態,沒有登錄則跳轉到登錄頁面。
4.2 實現步驟
- 創建自定義過濾器LoginCheckFilter.java
- 啟動類上加入@ServletComponentScan(這個不要忘記瞭)
- 完善過濾器處理邏輯
過濾器處理邏輯主要如下:
- 獲取本次處理請求的URL
- 判斷本次請求是否需要處理
- 若不需要,直接放行
- 判斷登陸狀態,若已經登陸直接放行
- 若未登陸則返回未登陸結果
流程圖如下:
4.3 代碼實現
package com.itheima.reggie.filter; import com.alibaba.fastjson.JSON; import com.itheima.reggie.common.R; import lombok.extern.slf4j.Slf4j; import org.springframework.util.AntPathMatcher; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author jektong * @date 2022/4/26 */ @WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*") @Slf4j public class LoginCheckFilter implements Filter { // 進行路徑匹配,支持通配符 public static final AntPathMatcher ANT_PATH_MATCHER = new AntPathMatcher(); @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //獲取本次處理請求的URL String requestURI = request.getRequestURI(); String[] urls = new String[]{ "/employee/login", "/employee/logout", "/backend/**", "/front/**" }; //判斷本次請求是否需要處理 boolean check = this.check(urls, requestURI); log.info("攔截到請求:{}", requestURI); //若不需要,直接放行 if (check){ log.info("請求無需登錄:{}", requestURI); filterChain.doFilter(request,response); return; } //判斷登陸狀態,若已經登陸直接放行 if(request.getSession().getAttribute("employee") != null){ log.info("用戶已登錄,id為:{}", request.getSession().getAttribute("employee")); filterChain.doFilter(request,response); return; } //若未登陸則返回未登陸結果 response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN"))); return; } /** * 進行路徑匹配,檢查是否可以放行 * @param urls 不攔截的路徑 * @param requestURI 請求路徑 * @return */ public boolean check(String[] urls, String requestURI) { for(String url : urls){ boolean match = ANT_PATH_MATCHER.match(url,requestURI); if(match){ return true; } } return false; } }
前端代碼(request.js)會通過一個值("NOTLOGIN")來進行攔截器響應匹配後進行頁面的跳轉:
// 響應攔截器 service.interceptors.response.use(res => { if (res.data.code === 0 && res.data.msg === 'NOTLOGIN') {// 返回登錄頁面 console.log('---/backend/page/login/login.html---') localStorage.removeItem('userInfo') window.top.location.href = '/backend/page/login/login.html' } else { return res.data } }
到此這篇關於Java精品項目瑞吉外賣之登陸的完善與退出功能篇的文章就介紹到這瞭,更多相關Java外賣系統登陸內容請搜索LevelAH以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持LevelAH!
推薦閱讀:
- Java攔截器和過濾器的區別分析
- Java中使用Filter過濾器的方法
- SpringBoot 請求參數忽略大小寫的實例
- Java CharacterEncodingFilter過濾器的理解和配置案例詳解
- java web項目Session獲取不到問題及解決