SpringMVC基础-拦截器(interception)

一、什么是拦截器

拦截器是SpringMVC提供的一个HandlerInterceptor接口,类似于Servlet 的过滤器Filter,用于对每一个请求前后进行相关的业务处理

二、拦截执行流程

拦截器流程图

1)客户端发送请求
2)前端控制器(DispatcherServlet)走到第一拦截器
3)第一个拦截器返回true后,执行第二拦截器
4)第二拦截返回true后,执行控制层(controller)
5)控制层将业务层处理好,先走到第二拦截器,再到第一个拦截
6)最终回到前端控制器DispatcherServlet
7)前端控制器再将页面返回值客户端

三、HandlerInterceptor为我们提供了三个方法

1)preHandle() : 在调用控制器之前执行
2)postHandle():在调用控制器之后页面加载之前执行
3)afterCompletion(): 在页面加载之后执行

四、代码

补充:项目目录结构


目录结构

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 {
  /**
   * 预处理拦截器
   * @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...执行");
    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...执行");
  }

  /**
   * 请求处理完毕回调
   * @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...执行");
  }
}

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...执行");
    return true;
  }

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

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

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...执行了");
    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">跳转成功页面</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)执行结果


index.jsp
执行结果
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、简介 SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。 可以定义拦截器链,连接器链就是将...
    酱紫_Johns阅读 224评论 0 0
  • springMVC中的拦截器 一、拦截器的作用 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器...
    哈哈大圣阅读 1,345评论 0 1
  • 在实际项目中,拦截器的使用是非常普遍的,例如在购物网站中通过拦截器可以拦截未登录的用户,禁止其购买商品,或者使用它...
    辽A丶孙悟空阅读 650评论 0 12
  • SpringMVC架构 用户发送请求至前端控制器DispatcherServlet,前端控制器收到请求后调用Han...
    月影追猎者阅读 268评论 0 0
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,612评论 0 11