• 溫馨提示×

    springMVC如何自定義攔截器

    發布時間:2022-10-25 13:59:09 來源:億速云 閱讀:83 作者:iii 欄目:編程語言

    這篇文章主要介紹“springMVC如何自定義攔截器”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“springMVC如何自定義攔截器”文章能幫助大家解決問題。

    一、概述

    springMVC也可以使用攔截器對請求攔截處理,用戶可以自定義攔截器來實現特定的功能,自定義攔截器必須實現HanderInterceptor接口;

    HanderInterceptor接口方法有:preHandle、postHandle、afterCompletion;

    preHandle:

    這個方法在業務處理器處理請求之前被調用,在該方法中對用戶請求request進行處理。如果程序員決定該攔截器對請求進行攔截處理后還要調用其他的攔截器,或者是業務處理器去進行處理,則返回true;如果程序員決定不需要再調用其他的組件去處理請求,則返回false;

    postHandle:

    這個方法在業務處理器處理完請求后,但是DispatcherServlet向客戶端返回響應前被調用;在該方法中對用戶請求request進行處理;

    afterCompletion:

    這個方法在DispatcherServlet完全處理完請求后被調用;可以在該方法中進行一些資源清理的操作;

    二、攔截器配置和實例驗證

    目錄結構:

    springMVC如何自定義攔截器

    1.配置:

    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>

    2.攔截器FirstInterceptor.java:

    必須實現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

    3.EmployeeController.java

    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

    4.success.jsp

    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>

    5.運行結果&流程:

    訪問http://localhost:8080/DataOperate/emp/testInteceptors時,頁面跳轉到success頁面;且控制臺臺打印了:

    preHandle

    testInteceptors

    postHandle

    afterCompletion

    三、多個攔截器:

    spring.xml配置特定路徑的攔截器:

    這里的路徑是訪問路徑是/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>

    攔截器:SecondInterceptor.java:

    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

    EmployeeController.java添加方法:

    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

    index.jsp:

    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如何自定義攔截器

    關于“springMVC如何自定義攔截器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    主題地圖

    gl她的舌伸湿润腿间双龙头