05.SpringMVC中拦截器的使用

1.结构图

2.控制层UserController:

package cn.itcast.controller;

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

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testInterceptor")
    public String testInterceptor(){
        System.out.println("ControllerTestInterceptor处理器执行成功.....");
        return "success";
    }
}

3.UserInterceptor1拦截器一

package cn.itcast.interceptor;

/*怎么配置?
* 使用拦截器的方法:
*   1..写自定义拦截器类
*   2..在springmvc.xml配置相应的拦截器
*
* 注:这个拦截器实现了一个接口没有报错,
*    那就说明已经在接口实现了对应的方法,
*    我们使用的时候直接重写使用就可以了
* */

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

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

//自定义拦截器
public class UserInterceptor1 implements HandlerInterceptor {
    /*
    * 预处理,controller中的方法执行前
    * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
    * return false 不放行
    * */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("UserInterceptor1拦截器执行了....pre前111");
        /*1.return true放行:此时执行结果:先执行拦截器中的内容——————执行处理器Controller中的内容————success.jsp页面内容*/

        /*2.return false不放行:此时的输出结果:只执行拦截器的内容or直接写请求跳转页面*/
        /*还可以:通过APi接口request跳转任意页面*/
        /*request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);*/
        return true;

    }
    /*
    *后处理:经过处理器Controller执行之后又被拦截的时候的拦截器
    *       也就是controller执行之后success页面执行之前
    * */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("UserInterceptor1拦截器执行了....post后111");
        /*在这也可以指定页面的跳转:此时不会经过success.jsp页面了*/
        /*request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);*/
    }

    /*
    * 最后处理:success.jsp执行之后会执行的方法
    *          跳转不了别的页面,因为已经响应执行结束了
    * */

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("UserInterceptor1拦截器执行了....after最后111");
    }
}

4.UserInterceptor2拦截器二

package cn.itcast.interceptor;

/*怎么配置?
* 使用拦截器的方法:
*   1..写自定义拦截器类
*   2..在springmvc.xml配置相应的拦截器
*
* 注:这个拦截器实现了一个接口没有报错,
*    那就说明已经在接口实现了对应的方法,
*    我们使用的时候直接重写使用就可以了
* */

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

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

//自定义拦截器
public class UserInterceptor2 implements HandlerInterceptor {
    /*
    * 预处理,controller中的方法执行前
    * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
    * return false 不放行
    * */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("UserInterceptor1拦截器执行了....pre前222");
        /*1.return true放行:此时执行结果:先执行拦截器中的内容——————执行处理器Controller中的内容————success.jsp页面内容*/

        /*2.return false不放行:此时的输出结果:只执行拦截器的内容or直接写请求跳转页面*/
        /*还可以:通过APi接口request跳转任意页面*/
        /*request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);*/
        return true;

    }
    /*
    *后处理:经过处理器Controller执行之后又被拦截的时候的拦截器
    *       也就是controller执行之后success页面执行之前
    * */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("UserInterceptor1拦截器执行了....post后222");
        /*在这也可以指定页面的跳转:此时不会经过success.jsp页面了*/
        /*request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);*/
    }

    /*
    * 最后处理:success.jsp执行之后会执行的方法
    *          跳转不了别的页面,因为已经响应执行结束了
    * */

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("UserInterceptor1拦截器执行了....after最后222");
    }
}

5.springmvc.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启注解扫描-->
    <context:component-scan base-package="cn.itcast"></context:component-scan>


    <!--配置视图解析器来找到success.jsp并且解析该视图-->
    <!--属性:id:解析器名 class:InternalResourceViewResolver解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--文件目录下:前缀:prefix-->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!--前缀:prefix:后缀为jsp的所有-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--取消前端控制器中对某些资源的一些不可拦截-->
    <!--属性:
        location:指location指定的目录不要拦截,直接请求,这里指在根目录下的resources文件下的所有文件
        mapping:值在resources文件下的所有文件(**代表所有文件)
    -->
    <!--这样的格式才对-->
    <!--<mvc:resources mapping="/images/**"  location="/WEB-INF/images/"/>
    <mvc:resources mapping="/css/**"  location="/WEB-INF/css/" />
    <mvc:resources mapping="/js/**"  location="/WEB-INF/js/" />-->

    <!--配置自定义拦截器-->
    <mvc:interceptors>
        <!--配置拦截器-->
        <mvc:interceptor>
            <!--要拦截的具体方法:
            两个配一个就行
            /**:所有的都要拦截
            /user/*:一级目录为user下的方法都要拦截
            -->
            <mvc:mapping path="/user/*"/>
            <!--不要拦截的方法-->
            <!--<mvc:exclude-mapping path=""/>-->

            <!--2.配置拦截器对象-->
            <bean class="cn.itcast.interceptor.UserInterceptor1"></bean>
        </mvc:interceptor>

        <!--配置第二个拦截器-->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.itcast.interceptor.UserInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>


    <!--开启springMVC框架注解的支持:默认对处理映射器和处理器适配器进行关联;;如果没有默认的适配器,那就再注解支持中加入-->
    <mvc:annotation-driven/>
</beans>

6.error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>错误页面:没有经过控制器,直接请求转发到这里</h3>
</body>
</html>

7.success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>恭喜拦截成功....</h3>
    <%--控制台输出语法:--%>
    <%System.out.println("页面:success.jsp执行成功");%>
</body>
</html>

8.index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>拦截器处理</h3>
    <a href="user/testInterceptor">点击拦截</a>
</body>
</html>

9.web.xml

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

  <!--01.前端控制器servlet-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <!--02.映射:/表示在什么路径下都可以-->
  <!--可以被请求到-->
  <servlet-mapping>
    <!--05.映射到这里来使用-->
    <servlet-name>dispatcherServlet</servlet-name>
    <!--03.你拦截的路径,发任何请求都会经过这个拦截到-->
    <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>

10.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.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>

11.运行

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值