基于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 功能測試
將工程重啟,然后在瀏覽器地址欄直接輸入系統管理后臺首頁,然后看看是否可以跳轉到登錄頁面即可。
智能推薦
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...
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 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...