使用Servlet Filter實(shí)現(xiàn)系統(tǒng)登錄權(quán)限
Servlet Filter介紹
過(guò)濾器是一些web應(yīng)用程序組件,可以綁定到一個(gè)web應(yīng)用程序中。但是與其他web應(yīng)用程序組件不同的是,過(guò)濾器是”鏈”在容器的處理過(guò)程中的。這就意味著它們會(huì)在servlet處理器之前訪問(wèn)一個(gè)進(jìn)入的請(qǐng)求,并且在外發(fā)響應(yīng)信息返回到客戶前訪問(wèn)這些響應(yīng)信息。這種訪問(wèn)使得過(guò)濾器可以檢查并修改請(qǐng)求和響應(yīng)的內(nèi)容。
Filter適用的場(chǎng)景:
1.為一個(gè)web應(yīng)用程序的新功能建立模型(可被添加到web應(yīng)用程序中或者從web應(yīng)用程序中刪除而不需要重寫(xiě)基層應(yīng)用程序代碼)
2.向過(guò)去的代碼添加新功能
3.用戶授權(quán)的Filter: Filter 負(fù)責(zé)檢查用戶請(qǐng)求,根據(jù)請(qǐng)求過(guò)濾用戶非法請(qǐng)求
4.日志Filter: 詳細(xì)記錄某些特殊的用戶請(qǐng)求
5.負(fù)責(zé)解碼的Filter: 包括對(duì)非標(biāo)準(zhǔn)編碼的請(qǐng)求解碼
Filter使用的位置:
過(guò)濾器放在web資源之前,可以在請(qǐng)求抵達(dá)它所應(yīng)用的web資源(可以是一個(gè)Servlet、一個(gè)Jsp頁(yè)面,甚至是一個(gè)HTML頁(yè)面)之前截獲進(jìn)入的請(qǐng)求,并且在它返回到客戶之前截獲輸出請(qǐng)求。Filter:用來(lái)攔截請(qǐng)求,處于客戶端與被請(qǐng)求資源之間,目的是重用代碼。Filter鏈,在web.xml中哪個(gè)先配置,哪個(gè)就先調(diào)用。在filter中也可以配置一些初始化參數(shù)。
Filter的用途:
1.在HttpServletRequest 到達(dá)Servlet 之前,攔截客戶的HttpServletRequest
2.根據(jù)需要檢查HttpServletRequest ,也可以修改HttpServletRequest 頭和數(shù)據(jù)
3.在HttpServletResponse 到達(dá)客戶端之前,攔截HttpServletResponse
4.根據(jù)需要檢查HttpServletResponse ,可以修改HttpServletResponse 頭和數(shù)據(jù)
一個(gè)Filter 可負(fù)責(zé)攔截多個(gè)請(qǐng)求或響應(yīng):一個(gè)請(qǐng)求或響應(yīng)也可被多個(gè)請(qǐng)求攔截。
使用Filter進(jìn)行系統(tǒng)登錄權(quán)限校驗(yàn)
這里我們使用對(duì)session進(jìn)行校驗(yàn)的方式,當(dāng)對(duì)某一模塊進(jìn)行請(qǐng)求時(shí),先校驗(yàn)當(dāng)前用戶的請(qǐng)求是否有session存在,如果有,繼續(xù)訪問(wèn),如果沒(méi)有,即跳轉(zhuǎn)到登錄頁(yè)。
第一步:
編寫(xiě)自己的Filter攔截類(lèi),攔截類(lèi)需要實(shí)現(xiàn)servlet的filter接口
public class WebFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); String currPath = request.getRequestURI(); //當(dāng)前請(qǐng)求的URL if (session.getAttribute("logined") != null) { filterChain.doFilter(servletRequest, servletResponse); } else { response.sendRedirect("/login.jsp"); } } @Override public void destroy() { } }
這里使用了攔截器鏈,當(dāng)我們配置了多個(gè)攔截器的時(shí)候,服務(wù)器會(huì)按照web.xml中過(guò)濾器定義的先后循序組裝成一條鏈,然后一次執(zhí)行其中的doFilter()方法。
第二步:
在web.xml中配置自定義的攔截器
web.xml:
<filter> <filter-name>webFilter</filter-name> <filter-class>com.test.interceptor.WebFilter</filter-class> <init-param> <param-name>skipPath</param-name> <param-value>ok.jsp</param-value> </init-param> </filter> <filter-mapping> <filter-name>webFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
這樣,就配置好了我們自定義的攔截器,如果有多個(gè)攔截器的話,請(qǐng)注意攔截器配置的順序,攔截會(huì)按照從上至下的順序進(jìn)行攔截,一般來(lái)說(shuō)處理編碼的攔截器配置在最上面。
通過(guò)上述步驟的操作,此時(shí)就可以通過(guò)URI進(jìn)行訪問(wèn)。此時(shí)如果能夠取得Session中的logined值時(shí),會(huì)直接進(jìn)入下一步處理,否則直接進(jìn)入登錄頁(yè)面。從而就完成了session的校驗(yàn)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud實(shí)現(xiàn)Eureka服務(wù)注冊(cè)與發(fā)現(xiàn)
這篇文章主要介紹了SpringCloud如何實(shí)現(xiàn)Eureka服務(wù)注冊(cè)與發(fā)現(xiàn),幫助大家更好的理解和學(xué)習(xí)使用SpringCloud,感興趣的朋友可以了解下2021-05-05Java參數(shù)傳遞實(shí)現(xiàn)代碼及過(guò)程圖解
這篇文章主要介紹了Java參數(shù)傳遞實(shí)現(xiàn)代碼及過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Java實(shí)現(xiàn)簡(jiǎn)單的抽牌游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的抽牌游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04Java 實(shí)現(xiàn)常見(jiàn)的非對(duì)稱(chēng)加密算法
這篇文章主要介紹了Java 實(shí)現(xiàn)常見(jiàn)的非對(duì)稱(chēng)加密算法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-11-11Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解
這篇文章主要介紹了Springboot下RedisTemplate的兩種序列化方式,通過(guò)定義一個(gè)配置類(lèi),自定義RedisTemplate的序列化方式,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09SpringBoot@DeleteMapping(/xxx/{id})請(qǐng)求報(bào)405的解決
這篇文章主要介紹了SpringBoot@DeleteMapping(/xxx/{id})請(qǐng)求報(bào)405的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01SpringBoot 整合 Netty 多端口監(jiān)聽(tīng)的操作方法
Netty提供異步的、基于事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架,用以快速開(kāi)發(fā)高性能、高可靠性的網(wǎng)絡(luò) IO 程序,是目前最流行的 NIO 框架,這篇文章主要介紹了SpringBoot 整和 Netty 并監(jiān)聽(tīng)多端口,需要的朋友可以參考下2023-10-10