<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們已經完成了後臺系統的登入功能開發,但是目前還存在一個問題,就是使用者如果不登入,直接存取系統首頁面,照樣可以正常存取。
很明顯,上面這種情況並不合理,我們希望看到的效果應該是,只有登入成功後才可以存取系統中的頁面,如果沒有登入, 存取系統中的任何介面都直接跳轉到登入頁面。
使用 過濾器或者攔截器來實現,在過濾器、攔截器中攔截前端發起的請求,判斷使用者是否已經完成登入,如果沒有登入則返回提示資訊,跳轉到登入頁面,那我這篇部落格選擇的是過濾器來實現這個效果。
過濾器具體的處理邏輯如下:
A. 獲取本次請求的URI
B. 判斷本次請求, 是否需要登入, 才可以存取
C. 如果不需要,則直接放行
D. 判斷登入狀態,如果已登入,則直接放行
E. 如果未登入, 則返回未登入結果
如果未登入,我們需要給前端返回什麼樣的結果呢? 這個時候, 可以去看看前端程式碼是如何處理的,大家可以先看看我這裡的前端是如何處理的。(每個前端處理方式都不一樣,隨機應變)
這個是我們前端的攔截器,這個攔截器就是用來攔截我們伺服器端給頁面上的響應的,一旦我們後端給前端響應之後,它就會執行下面的程式碼進行判斷。
大家也可以看到它裡面的if判斷 ,如果我們後端給前端返回的資料是
res.data.code = 0 && res.data.msg='NOTLOGIN'
那它就會自動跳到登入介面。
首先我們建立一個過濾器 LoginCheckFilter 並實現 Filter 介面, 在doFilter方法中完成校驗的邏輯。
/** * @description: 檢查使用者是否已經完成登入 * @author: Jie * @date: 2022/8/10 9:48 **/ @WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*") @Slf4j public class LoginCheckFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { } }
注:
@WebFilter :用於將一個類宣告為過濾器,filterName 指定過濾器的名稱,urlPatterns :需要攔截的請求路徑
首先我們要獲取到 request 和 response 和請求路徑,這三位後面都會用到。
現在我們獲取到了請求路徑,就可以去判斷哪些請求路徑是需要進行處理的,因為在專案實際開發中,我們的專案中有些地方是不需要登入也能進行存取的,比如淘寶和京東的首頁,大家不登陸也能存取吧,所以我們要將這些路徑定義出來,如果使用者存取的是這些路徑,那麼我們就直接放行,就不處理了。
上面就是我定義不需要攔截的請求路徑,相信大家看到了最後兩個路徑有些不一樣,這裡呢我們用的是萬用字元的方式。
萬用字元規則:
符號 | 含義 |
---|---|
? | 匹配一個字元 |
* | 匹配0個或多個字元 |
** | 匹配0個或多個目錄/字元 |
但是現在有一個問題,比如我現在請求的是/backend/index.html ,這對不上呀!那該如何去匹配呢?
這個時候我們就要認識一個新的物件 AntPathMatcher 。
現在我們通過這個路徑匹配器,匹配一下這個請求過來的路徑是否能匹配上我們定義不需要攔截的請求路徑裡的任意一項。
這裡我們封裝一個方法用來判斷本次請求是否需要處理。
這樣我們在上面呼叫,然後判斷一下是否需要處理,如果不需要處理,那就直接放行即可。
反之就是需要判斷是否需要登入,那我們如何判斷使用者是否登入呢?因為我是登入的時候將使用者的資訊存到session 裡的 ,那這裡我就是 從session 裡 獲取登入使用者,如果能獲取出來,就代表使用者已經登入。
如果使用者沒有登入我們就需要通過輸出流方式向用戶端頁面響應資料。
完整程式碼 :
package com.jie.reggjie.filter; import cn.hutool.core.text.AntPathMatcher; import com.alibaba.fastjson.JSON; import com.jie.reggjie.common.R; import lombok.extern.slf4j.Slf4j; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @description: 檢查使用者是否已經完成登入 * @author: Jie * @date: 2022/8/10 9:48 **/ @WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*") @Slf4j public class LoginCheckFilter implements Filter { /** * 路徑匹配器,支援萬用字元 */ 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; String requestURI = request.getRequestURI(); log.info("攔截到請求,{}", requestURI); //2、判斷本次請求是否需要處理 //定義不需要處理的請求路徑 String[] urls = new String[]{ "/employee/login", "/employee/logout", "/backend/**", "/front/**" }; boolean check = check(urls, requestURI); //3、如果不需要處理,則直接放行 if (check) { log.info("本次請求{}不需要處理", requestURI); filterChain.doFilter(request, response); return; } //4、判斷登入狀態,如果已登入,則直接放行 if (request.getSession().getAttribute("employee") != null) { log.info("使用者已登入,使用者id為:{}", request.getSession().getAttribute("employee")); filterChain.doFilter(request, response); return; } log.info("使用者未登入"); //5、如果未登入則返回未登入結果,通過輸出流方式向用戶端頁面響應資料 response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN"))); return; } public boolean check(String[] urls, String requestURI) { for (String url : urls) { boolean match = PATH_MATCHER.match(url, requestURI); if (match) { return true; } } return false; } }
需要在啟動類上, 加上Servlet元件掃描的註解, 來掃描過濾器設定的@WebFilter註解, 掃描上之後, 過濾器在執行時就生效了。
到此這篇關於Java利用過濾器實現完善登入功能的文章就介紹到這了,更多相關Java過濾器 登入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45