SSM項(xiàng)目中使用攔截器和過濾器的實(shí)現(xiàn)示例
一、攔截器概述
Spring MVC 也可以使用攔截器對(duì)請(qǐng)求進(jìn)行攔截處理,用戶可以自定義攔截器來(lái)實(shí)現(xiàn)特定 的功能,自定義的攔截器必須實(shí)現(xiàn) HandlerInterceptor 接口
- preHandle():這個(gè)方法在業(yè)務(wù)處理器處理請(qǐng)求之前被調(diào)用,在該方法中對(duì)用戶請(qǐng)求 request 進(jìn)行處理。如果程序員決定該攔截器對(duì)請(qǐng)求進(jìn)行攔截處理后還要調(diào)用其他 的攔截器,或者是業(yè)務(wù)處理器去進(jìn)行處理,則返回 true;如果程序員決定不需要 再調(diào)用其他的組件去處理請(qǐng)求,則返回 false。
- postHandle():這個(gè)方法在業(yè)務(wù)處理器處理完請(qǐng)求后,但是 DispatcherServlet向客戶端返回響應(yīng)前被調(diào)用,在該方法中對(duì)用戶請(qǐng)求 request 進(jìn)行處理。
- afterCompletion():這個(gè)方法在 DispatcherServlet 完全處理完請(qǐng)求后被調(diào)用,可以 在該方法中進(jìn)行一些資源清理的操作。
二、攔截器配置步驟
1、創(chuàng)建一個(gè)攔截器(實(shí)現(xiàn)HandlerInterceptor接口)
package com.ssm.Interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; //攔截器 public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //獲取請(qǐng)求的URL String requestURI=request.getRequestURI(); HttpSession session=request.getSession(); Object userInfo=request.getSession().getAttribute("USERINFO"); System.out.println("鏈接:"+requestURI+"進(jìn)入攔截器"); if(userInfo==null){ //表示未登錄就想進(jìn)入系統(tǒng) //直接重定向到登錄界面 String serverPath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/index.jsp"; response.sendRedirect(serverPath); return false; }else{ //登陸成功,不攔截 return true; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("跳轉(zhuǎn)后攔截"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("渲染后攔截"); } }
這個(gè)攔截器我只是寫個(gè)Demo,所以只進(jìn)行了是否登錄的驗(yàn)證,真正的項(xiàng)目中你也可以在這里進(jìn)行一些權(quán)限的判斷等等。
2、配置攔截器
<!--攔截器配置--> <mvc:interceptors> <!--后臺(tái)訪問攔截器--> <mvc:interceptor> <!--攔截所有資源--> <mvc:mapping path="/**"/> <!--登陸不攔截--> <mvc:exclude-mapping path="/user/login"/> <!--郵箱激活不攔截--> <mvc:exclude-mapping path="/user/activeEmail"/> <!--靜態(tài)資源的目錄不攔截--> <mvc:exclude-mapping path="/commons/**"/> <!--用戶通過郵箱中重置密碼的鏈接不攔截--> <mvc:exclude-mapping path="/email/resetPassword"/> <!--激活郵箱的驗(yàn)證不攔截--> <mvc:exclude-mapping path="/user/validateCode"/> <!--實(shí)現(xiàn)攔截功能的類--> <bean class="com.ssm.Interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
由于配置了<mvc:mapping path="/**"/>
會(huì)攔截所有資源,我們必須用<mvc:exclude-mapping path="/這里寫你想放行的請(qǐng)求">
標(biāo)簽放行靜態(tài)資源和一些不用攔截的請(qǐng)求(登錄等等)。<bean class="com.ssm.Interceptor.LoginInterceptor"></bean>
是第一步創(chuàng)建的攔截器。
3、測(cè)試下攔截器:
在地址欄輸入個(gè)非法的請(qǐng)求試試:
通過地址欄可以看到,頁(yè)面已經(jīng)被重定向到了登陸界面,攔截成功。
但是攔截器并不能攔截jsp頁(yè)面的訪問,這個(gè)時(shí)候兩種選擇:
1、將所有jsp頁(yè)面都放在WEB-INF目錄下
2、用Servlet過濾器(雖然感覺技術(shù)有點(diǎn)老了)
三、過濾器概述
Servlet過濾器主要用于對(duì)客戶端(瀏覽器)的請(qǐng)求進(jìn)行過濾處理,然后將過濾后的請(qǐng)求轉(zhuǎn)交給下一資源。
四、過濾器配置步驟
1、創(chuàng)建一個(gè)過濾器(實(shí)現(xiàn)Filter接口)
package com.ssm.Filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; //自定義過濾器 public class LoginFilter implements Filter { //初始化方法 @Override public void init(FilterConfig filterConfig) throws ServletException { //初始化處理 System.out.println("過濾器初始化"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //過濾處理 //servletRequest 是個(gè)接口,HttpServletRequest 是實(shí)現(xiàn),但是有些方法是HttpServletRequest獨(dú)有的,如:getSession //HttpServletRequest接口是繼承servletRequest接口,增加了和http相關(guān)的方法 HttpServletRequest request= (HttpServletRequest) servletRequest; HttpServletResponse response= (HttpServletResponse) servletResponse; // String requestURI=request.getRequestURI(); // System.out.println("鏈接:"+requestURI+"進(jìn)入過濾器"); HttpSession session=request.getSession(); if(session.getAttribute("USERINFO")==null){ //非法請(qǐng)求,直接跳轉(zhuǎn)到登陸界面 String serverPath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/index.jsp"; response.sendRedirect(serverPath); }else{ //正常登錄,放行 filterChain.doFilter(request,response); } } @Override public void destroy() { //釋放資源 System.out.println("過濾器銷毀"); } }
2、配置web.xml
<!--使用過濾器實(shí)現(xiàn)登陸控制--> <!--filter標(biāo)簽用于聲明過濾器對(duì)象--> <filter> <!--過濾器名稱--> <filter-name>LoginFilter</filter-name> <!--過濾器完整類名--> <filter-class>com.ssm.Filter.LoginFilter</filter-class> </filter> <!--filter-mapping用于創(chuàng)建過濾器的映射,指定Web應(yīng)用中,哪些URL應(yīng)用哪一個(gè)過濾器進(jìn)行處理--> <filter-mapping> <filter-name>LoginFilter</filter-name> <!--url-pattern用于指定過濾器應(yīng)用的URL--> <!--過濾的頁(yè)面(自定義),這里對(duì)登錄界面就不要過濾了--> <url-pattern>/views/*</url-pattern> </filter-mapping>
各個(gè)標(biāo)簽的解釋都寫在注釋里面了,至于需要過濾的資源,你可以根據(jù)自己的需求再添加
<url-pattern>
,我主要是想把views目錄下面的jsp全部過濾。
3、測(cè)試過濾器
不登陸直接訪問后臺(tái)jsp頁(yè)面:
訪問之后:
可以看到,過濾器直接將請(qǐng)求重定向到了登陸界面,過濾器過濾成功。
五、總結(jié)
現(xiàn)在已經(jīng)有了很多權(quán)限管理的框架了,Shiro、Spring Security等等,以后盡量還是用新技術(shù)。
到此這篇關(guān)于SSM項(xiàng)目中使用攔截器和過濾器的文章就介紹到這了,更多相關(guān)SSM項(xiàng)目中使用攔截器和過濾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java高級(jí)之虛擬機(jī)加載機(jī)制的實(shí)例講解
下面小編就為大家分享一篇Java高級(jí)之虛擬機(jī)加載機(jī)制的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2017-12-12IDEA JavaWeb項(xiàng)目啟動(dòng)運(yùn)行后出現(xiàn)404錯(cuò)誤的解決方法
這篇文章主要介紹了IDEA JavaWeb項(xiàng)目啟動(dòng)運(yùn)行后出現(xiàn)404錯(cuò)誤的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java @Transactional與synchronized使用的問題
這篇文章主要介紹了Java @Transactional與synchronized使用的問題,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的2023-01-01Spring Boot 和 Spring 到底有啥區(qū)別你知道嗎
Spring Boot框架的核心就是自動(dòng)配置,只要存在相應(yīng)的jar包,Spring就幫我們自動(dòng)配置。接下來(lái)通過本文給大家介紹Spring與Spring boot的區(qū)別介紹,非常不錯(cuò),需要的朋友參考下吧2021-08-08