• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 基于Springboot外賣系統05:用戶非登陸狀態的頁面攔截器實現

    標簽: # Springboot點餐系統  spring  java  后端  spring boot  servlet

    1. 完善登錄功能

    1.1 問題分析

    用戶訪問接口驗證,如果用戶沒有登錄,則不讓他訪問除登錄外的任何接口。
    1.前端登錄,后端創建session,返給前端

    2.前端訪問其他接口,失效或不存在,則返回失效提示,前端根據接口返回的失效提示,讓其跳轉到登錄界面

    1). 目前現狀

    用戶如果不登錄,直接訪問系統首頁面,照樣可以正常訪問。

     2). 理想效果

    只有登錄成功后才可以訪問系統中的頁面,如果沒有登錄, 訪問系統中的任何界面都直接跳轉到登錄頁面。

     1.2 攔截器思路

     如果未登錄,我們需要給前端返回什么樣的結果呢? 這個時候, 我們可以去看看前端是如何處理的 ?

     1.3 代碼實現

    1). 定義登錄校驗過濾器

    自定義一個過濾器 LoginCheckFilter 并實現 Filter 接口, 在doFilter方法中完成校驗的邏輯。 

    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;
    
    /**
     * Description: 檢查用戶是否已經完成登陸
     */
    
    @WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")  //設置攔截器,設置攔截的網頁區域
    @Slf4j
    public class LoginCheckFilter implements Filter {
        // 路徑匹配器,支持通配符,因為下面的序列使用了通配符
        // AntPathMatcher匹配規則  ? 匹配一個字符    * 匹配0個或多個字符   ** 匹配0個或多個目錄/字符
        public static final AntPathMatcher 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;
            //  A. 獲取本次請求的URI
            String requestURI = request.getRequestURI();
            log.info("攔截的請求:{}",requestURI);
    
            // 定義不攔截的序列,只攔截頁面數據請求,不攔截頁面格式
            String[] urls = new String[]{
                    "/employee/login",
                    "/employee/logout",
                    "/backend/**",
                    "/front/**"
            };
            //  B. 判斷本次請求, 是否需要登錄, 才可以訪問
            boolean check = check(urls, requestURI);
            //  C. 如果不需要,則直接放行
            if(check){
                log.info("本次請求{}不需要處理",requestURI);
                filterChain.doFilter(request,response);
                return;
            }
            //  D. 判斷登錄狀態,如果已登錄,則直接放行
            if(request.getSession().getAttribute("employee")!=null){
                log.info("用戶已登錄,用戶id為:{}",request.getSession().getAttribute("employee"));
                filterChain.doFilter(request,response);
                return;
            }
            //  E. 如果未登錄, 則返回未登錄結果
            response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
    
            return;
        }
    
        public boolean check(String[] urls,String requestURI){
            /**@Description: 路徑匹配,檢查本次請求是否需要放行
             * @author LiBiGo
             * @date 2022/8/12 16:50
             */
            for (String url : urls) {
                boolean match = PATH_MATCHER.match(url, requestURI); // 使用通配符對象,配對資源
                if(match){
                    return true;
                }
            }
            return false;
        }
    }
    

    2). 開啟組件掃描

    package com.itheima.reggie;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    
    @Slf4j //是lombok中提供的注解, 用來通過slf4j記錄日志。
    @SpringBootApplication // 啟動類
    // 需要在引導類上,加上Servlet組件掃描的注解,來掃描過濾器配置的@WebFilter注解,掃描后,使過濾器在運行時生效。
    @ServletComponentScan //  掃描攔截器注解
    
    public class ReggieApplication {
        /**@Description: 當搭建完上述的基礎環境之后, 就可以通過引導類, 啟動該項目。
         * @author LiBiGo
         * @date 2022/8/12 0:23
         */
        public static void main(String[] args) {
            SpringApplication.run(ReggieApplication.class,args);
            log.info("項目啟動成功............");
        }
    }
    

    1.4 功能測試

    將工程重啟,然后在瀏覽器地址欄直接輸入系統管理后臺首頁,然后看看是否可以跳轉到登錄頁面即可。

    版權聲明:本文為qq_39237205原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_39237205/article/details/126307756

    智能推薦

    SpringBoot-05-web(實現登錄頁面并且設置攔截器)

    1、處理無法使用靜態資源的問題   我們確實可以跳轉成功了,但是可以看到跳轉的界面非常粗糙,導入的靜態文件都沒有使用到。原因是我們的靜態文件下載下來都是html或者js語法格式,導致thymeleaf都沒有起作用。因此做出以下更改:   第一步:想要使用thymeleaf必須在頭部添加其地址   第二步:修改index.html文件中的語...

    Spring Boot攔截器配置攔截登陸

    一、pom.xml配置     這里很簡單,先引入spring-boot,parent是父模塊,有父模塊統一進行spring-boot版本管理,dependencies中與spring-boot綁定的包不需要再指定版本。 二、新建WebConfigurer     1、如圖,新建config包,用來裝初始化文件,在config之下新建WebConfigure...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    猜你喜歡

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    精品国产乱码久久久久久蜜桃不卡