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!

推薦閱讀: