SpringMVC基礎(chǔ)-攔截器(interception)

一丁稀、什么是攔截器

攔截器是SpringMVC提供的一個HandlerInterceptor接口授账,類似于Servlet 的過濾器Filter,用于對每一個請求前后進行相關(guān)的業(yè)務(wù)處理

二乍恐、攔截執(zhí)行流程

攔截器流程圖

1)客戶端發(fā)送請求
2)前端控制器(DispatcherServlet)走到第一攔截器
3)第一個攔截器返回true后百匆,執(zhí)行第二攔截器
4)第二攔截返回true后仑荐,執(zhí)行控制層(controller)
5)控制層將業(yè)務(wù)層處理好,先走到第二攔截器洒扎,再到第一個攔截
6)最終回到前端控制器DispatcherServlet
7)前端控制器再將頁面返回值客戶端

三袍冷、HandlerInterceptor為我們提供了三個方法

1)preHandle() : 在調(diào)用控制器之前執(zhí)行
2)postHandle():在調(diào)用控制器之后頁面加載之前執(zhí)行
3)afterCompletion(): 在頁面加載之后執(zhí)行

四乃戈、代碼

補充:項目目錄結(jié)構(gòu)


目錄結(jié)構(gòu)

1)pom.xml

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!-- 定義Spring版本號 -->
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

2)springmvc.xml中配置攔截(存放在resources目錄下)

  <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 開啟注解掃描 -->
    <context:component-scan base-package="work.chenc.*"></context:component-scan>

    <!-- 開啟視圖解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!-- 配置攔截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/test/*"/>
<!--
            那些請求不需要進行攔截
            <mvc:exclude-mapping path=""/>
            -->
<!--
            那些請求需要進行攔截
            <mvc:exclude-mapping path=""/>-->
            <!-- 配置自定義攔截器 -->
            <bean class="work.chenc.interception.FirstInterception"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/test/*"/>
            <bean class="work.chenc.interception.SecondInterception"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

    <!-- 開啟SpringMVC注解支持 -->
    <mvc:annotation-driven/>
</beans>

3)web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!-- 配置前端控制器 -->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 加載SpringMVC配置文件 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!-- 過濾字符集編碼 -->
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

4)第一個攔截器FirstInterception

package work.chenc.interception;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定義攔截器-第一個攔截器
 */
public class FirstInterception implements HandlerInterceptor {
  /**
   * 預(yù)處理攔截器
   * @param request
   * @param response
   * @param handler
   * @return
   * @throws Exception
   */
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("FirstInterception-preHandle...執(zhí)行");
    return true;
  }

  /**
   * 后處理攔截器
   * @param request
   * @param response
   * @param handler
   * @param modelAndView
   * @throws Exception
   */
  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("FirstInterception-postHandle...執(zhí)行");
  }

  /**
   * 請求處理完畢回調(diào)
   * @param request
   * @param response
   * @param handler
   * @param ex
   * @throws Exception
   */
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("FirstInterception-afterCompletion...執(zhí)行");
  }
}

5)第二個攔截器SecondInterception

package work.chenc.interception;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定義攔截器-第二個攔截器
 */
public class SecondInterception implements HandlerInterceptor {
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("SecondInterception-preHandle...執(zhí)行");
    return true;
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("SecondInterception-postHandle...執(zhí)行");
  }

  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("SecondInterception-afterCompletion...執(zhí)行");
  }
}

6)前端控制器controller

package work.chenc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "/test")
public class TestController {

  @RequestMapping(value = "/testInterception")
  public String testInterception() {
    System.out.println("testInterception...執(zhí)行了");
    return "success";
  }
}

7)jsp頁面 index.jsp success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>首頁</title>
</head>
<body>
  <h1>首頁</h1>
  <a href="test/testInterception">跳轉(zhuǎn)成功頁面</a>
</body>
</html>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>success</title>
</head>
<body>
  <h1>成功頁面</h1>

  <% System.out.println("success頁面加載"); %>
</body>
</html>

8)執(zhí)行結(jié)果


index.jsp
執(zhí)行結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闯睹,隨后出現(xiàn)的幾起案子戏羽,更是在濱河造成了極大的恐慌,老刑警劉巖瞻坝,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛛壳,死亡現(xiàn)場離奇詭異,居然都是意外死亡所刀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門捞挥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浮创,“玉大人,你說我怎么就攤上這事砌函≌杜” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵讹俊,是天一觀的道長垦沉。 經(jīng)常有香客問我,道長仍劈,這世上最難降的妖魔是什么厕倍? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮贩疙,結(jié)果婚禮上讹弯,老公的妹妹穿的比我還像新娘况既。我一直安慰自己,他們只是感情好组民,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布棒仍。 她就那樣靜靜地躺著,像睡著了一般臭胜。 火紅的嫁衣襯著肌膚如雪莫其。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天耸三,我揣著相機與錄音乱陡,去河邊找鬼。 笑死吕晌,一個胖子當著我的面吹牛蛋褥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睛驳,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼烙心,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乏沸?” 一聲冷哼從身側(cè)響起淫茵,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹬跃,沒想到半個月后匙瘪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蝶缀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年丹喻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翁都。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡碍论,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柄慰,到底是詐尸還是另有隱情鳍悠,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布坐搔,位于F島的核電站藏研,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏概行。R本人自食惡果不足惜蠢挡,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧袒哥,春花似錦缩筛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至却紧,卻和暖如春桐臊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晓殊。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工断凶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巫俺。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓认烁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親介汹。 傳聞我的和親對象是個殘疾皇子却嗡,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一、簡介 SpringMVC框架中的攔截器用于對處理器進行預(yù)處理和后處理的技術(shù)嘹承。 可以定義攔截器鏈窗价,連接器鏈就是將...
    醬紫_Johns閱讀 213評論 0 0
  • springMVC中的攔截器 一、攔截器的作用 SpringMVC的處理器攔截器類似于Servlet開發(fā)中的過濾器...
    哈哈大圣閱讀 1,333評論 0 1
  • 在實際項目中叹卷,攔截器的使用是非常普遍的撼港,例如在購物網(wǎng)站中通過攔截器可以攔截未登錄的用戶,禁止其購買商品骤竹,或者使用它...
    遼A丶孫悟空閱讀 643評論 0 12
  • SpringMVC架構(gòu) 用戶發(fā)送請求至前端控制器DispatcherServlet帝牡,前端控制器收到請求后調(diào)用Han...
    月影追獵者閱讀 241評論 0 0
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友蒙揣。感恩相遇否灾!感恩不離不棄。 中午開了第一次的黨會鸣奔,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,569評論 0 11