您好,登錄后才能下訂單哦!
這篇文章主要介紹“springMVC如何自定義攔截器”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“springMVC如何自定義攔截器”文章能幫助大家解決問題。
springMVC也可以使用攔截器對請求攔截處理,用戶可以自定義攔截器來實現特定的功能,自定義攔截器必須實現HanderInterceptor接口;
HanderInterceptor接口方法有:preHandle、postHandle、afterCompletion;
這個方法在業務處理器處理請求之前被調用,在該方法中對用戶請求request進行處理。如果程序員決定該攔截器對請求進行攔截處理后還要調用其他的攔截器,或者是業務處理器去進行處理,則返回true;如果程序員決定不需要再調用其他的組件去處理請求,則返回false;
這個方法在業務處理器處理完請求后,但是DispatcherServlet向客戶端返回響應前被調用;在該方法中對用戶請求request進行處理;
這個方法在DispatcherServlet完全處理完請求后被調用;可以在該方法中進行一些資源清理的操作;
web.xml配置:只配置了DispatcherServlet
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://xmlns.jcp.org/xml/ns/javaee" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 5 id="WebApp_ID" version="3.1"> 6 <servlet> 7 <servlet-name>springDispatcherServlet</servlet-name> 8 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 9 <!-- 配置DispatcherServletd 一個初始化參數:配置springmvc配置文件的位置和名稱 --> 10 <!-- 實際上也可以不通過 contextConfigLocation 來配置Springmvc的配置文件,而是用默認的 即默認的配置文件為 11 /WEB-INF/<servlet-name>-servlet.xml 本項目默認位置配置文件即為: /WEB-INF/springDispatcherServlet-servlet.xml --> 12 <init-param> 13 <param-name>contextConfigLocation</param-name> 14 <param-value>classpath:spring.xml</param-value> 15 </init-param> 16 <!-- 表示springDispatcherServlet在加載的時候被創建 --> 17 <load-on-startup>1</load-on-startup> 18 </servlet> 19 20 <!-- Map all requests to the DispatcherServlet for handling --> 21 <servlet-mapping> 22 <servlet-name>springDispatcherServlet</servlet-name> 23 <url-pattern>/</url-pattern> 24 </servlet-mapping> 25 </web-app>
spring.xml配置:基礎配置+攔截器配置;
基礎配置包括:包掃描的配置、視圖解析器配置、<mvc:annotation-driven></mvc:annotation-driven>;
攔截器配置:
<mvc:interceptors> <!-- 配置自定義攔截器 --> <bean class="interceptors.FirstInterceptor"></bean> </mvc:interceptors>
完整文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:mvc="http://www.springframework.org/schema/mvc" 5 xmlns:context="http://www.springframework.org/schema/context" 6 xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 9 10 <context:component-scan base-package="handler"></context:component-scan> 11 <!-- 配置視圖解析器 如何把handler 方法返回值解析為實際的物理視圖 --> 12 <bean 13 class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 14 <property name="prefix" value="/WEB-INF/views/"></property> 15 <property name="suffix" value=".jsp"></property> 16 </bean> 17 18 <mvc:annotation-driven></mvc:annotation-driven> 19 20 <mvc:interceptors> 21 <!-- 配置自定義攔截器 --> 22 <bean class="interceptors.FirstInterceptor"></bean> 23 </mvc:interceptors> 24 25 </beans>
必須實現HanderInterceptor接口
1 package interceptors; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.springframework.web.servlet.HandlerInterceptor; 7 import org.springframework.web.servlet.ModelAndView; 8 9 /** 10 * 攔截器<br> 11 * 多個攔截器的情況:preHandle 順序執行;postHandle倒敘執行;afterCompletion倒敘執行 12 * 13 * @author lixiuming 14 * 15 */ 16 public class FirstInterceptor implements HandlerInterceptor { 17 /** 18 * 該方法在目標方法之前被調用<br> 19 * 若返回值為true,則繼續調用后續的攔截器和目標方法<br> 20 * 若返回值為false,則不會再執行后續的攔截器和目標方法;<br> 21 * 使用場景可以考慮做權限,日志、事務等 22 */ 23 @Override 24 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 25 throws Exception { 26 System.out.println("preHandle"); 27 // TODO Auto-generated method stub 28 return HandlerInterceptor.super.preHandle(request, response, handler); 29 } 30 31 /** 32 * 調用目標方法之后,但渲染視圖之前被調用;使用場景 可以對請求域中的屬性或者視圖做出修改 33 */ 34 @Override 35 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 36 ModelAndView modelAndView) throws Exception { 37 System.out.println("postHandle"); 38 // TODO Auto-generated method stub 39 HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); 40 } 41 42 /** 43 * 渲染視圖之后被調用; 使用場景:釋放資源 44 */ 45 @Override 46 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 47 throws Exception { 48 System.out.println("afterCompletion"); 49 // TODO Auto-generated method stub 50 HandlerInterceptor.super.afterCompletion(request, response, handler, ex); 51 } 52 53
1 package handler; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 6 @RequestMapping("/emp") 7 @Controller 8 public class EmployeeController { 9 10 @RequestMapping("/testInteceptors") 11 public String testFileUpload() { 12 System.out.println("testInteceptors"); 13 return "success"; 14 } 15
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <meta charset="UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 success 11 </body> 12 </html>
訪問http://localhost:8080/DataOperate/emp/testInteceptors時,頁面跳轉到success頁面;且控制臺臺打印了:
preHandle
testInteceptors
postHandle
afterCompletion
這里的路徑是訪問路徑是/emp/testIndex,也就是說,訪問/emp/testIndex時,調用第二個攔截器;
1 <mvc:interceptors> 2 <!-- 配置自定義攔截器 --> 3 <bean class="interceptors.FirstInterceptor"></bean> 4 <!-- 配置攔截器(不)作用的路徑 --> 5 <mvc:interceptor> 6 <mvc:mapping path="/emp/testIndex"/> 7 <bean class="interceptors.SecondInterceptor"></bean> 8 </mvc:interceptor> 9 </mvc:interceptors>
1 package interceptors; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.springframework.web.servlet.HandlerInterceptor; 7 import org.springframework.web.servlet.ModelAndView; 8 9 /** 10 * 攔截器 11 * 12 * @author lixiuming 13 * 14 */ 15 public class SecondInterceptor implements HandlerInterceptor { 16 /** 17 * 該方法在目標方法之前被調用<br> 18 * 若返回值為true,則繼續調用后續的攔截器和目標方法<br> 19 * 若返回值為false,則不會再執行后續的攔截器和目標方法;<br> 20 * 使用場景可以考慮做權限,日志、事務等 21 */ 22 @Override 23 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 24 throws Exception { 25 System.out.println("SecondInterceptor preHandle"); 26 // TODO Auto-generated method stub 27 return HandlerInterceptor.super.preHandle(request, response, handler); 28 } 29 30 /** 31 * 調用目標方法之后,但渲染視圖之前被調用;使用場景 可以對請求域中的屬性或者視圖做出修改 32 */ 33 @Override 34 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 35 ModelAndView modelAndView) throws Exception { 36 System.out.println(" SecondInterceptor postHandle"); 37 // TODO Auto-generated method stub 38 HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); 39 } 40 41 /** 42 * 渲染視圖之后被調用; 使用場景:釋放資源 43 */ 44 @Override 45 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 46 throws Exception { 47 System.out.println(" SecondInterceptor afterCompletion"); 48 // TODO Auto-generated method stub 49 HandlerInterceptor.super.afterCompletion(request, response, handler, ex); 50 } 51 52
1 package handler; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 6 @RequestMapping("/emp") 7 @Controller 8 public class EmployeeController { 9 10 @RequestMapping("/testInteceptors") 11 public String testFileUpload() { 12 System.out.println("testInteceptors"); 13 return "success"; 14 } 15 16 @RequestMapping("/testIndex") 17 public String testIndex() { 18 System.out.println("testInteceptors"); 19 return "forward:/index.jsp"; 20 } 21
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@page import="java.util.*"%> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta charset="UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <h4>welcom to lean interceptor !</h4> 12 13 14 </body> 15 </html>
訪問:http://localhost:8080/DataOperate/emp/testInteceptors時,頁面跳轉到success頁面;且控制臺臺打印了:
preHandle
testInteceptors
postHandle
afterCompletion
訪問:http://localhost:8080/DataOperate/emp/testIndex時,頁面跳轉到index.jsp頁面;且控制臺臺打印了:
preHandle
SecondInterceptor preHandle
testInteceptors
SecondInterceptor postHandle
postHandle
SecondInterceptor afterCompletion
afterCompletion
多個攔截器運行流程:多個攔截器的情況:preHandle 順序執行;postHandle倒敘執行;afterCompletion倒敘執行
關于“springMVC如何自定義攔截器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。