springMVC中的拦截器

springMVC中的拦截器

Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理

用户可以自己定义一些拦截器来实现特定的功能。

谈到拦截器,还要向大家提一个词——拦截器链(Interceptor Chain)。拦截器链就是将拦截器按一定的顺 序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用。

拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。

拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦 截的

它也是 AOP 思想的具体应用。
我们要想自定义拦截器, 要求必须实现:HandlerInterceptor 接口。

过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
在这里插入图片描述
在这里插入图片描述
一路下一步,一个 web工程的打包方式一定是 war
在这里插入图片描述
引入依赖 jar包

  <groupId>club.adger</groupId>
  <artifactId>myIntercepter</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>


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

创建好,没有生成的目录
配置web.xml

<!--配置前端控制器-->
  <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>
  <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>

在 resources目录下建springmvc.xml,这里的名字 取接于你的 classpath:下的名字

建立springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<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="club.adger.controller"/>

    <!-- 视图解析器对象 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--前端控制器,哪些静态资源不拦截-->
    <!--<mvc:resources location="//" mapping="/css/**"/>-->

    <!-- 开启SpringMVC框架注解的支持 -->
    <mvc:annotation-driven />
</beans>

编写页面
index.jsp

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

在 WEB-INF里面 写一个 pages 根据你的跳转写

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>跳转成功</h2>
</body>
</html>

编写Controller

package club.adger.controller;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: Adger
 * @Date: 2020/05/02/21:49
 */
@Controller
@RequestMapping("/user")
public class UserController {


  @RequestMapping("/testInterceptor")
  public String testInterceptor(){
    System.out.println("执行了");
    return "index";
  }
}

看下环境成功没
在这里插入图片描述
可以看见成功了
在这里插入图片描述
如果控制台乱码的话,加上这句话试试,或者看二图
-Dfile.encoding=UTF-8
在这里插入图片描述
我到就 解决了
写 拦截器了,配置拦截器

package club.adger.myintercepter;

import org.springframework.web.servlet.HandlerInterceptor;

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

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: Adger
 * @Date: 2020/05/02/22:01
 */
public class MyInterCeptor implements HandlerInterceptor {

  /**
   * 预处理,Controllrer 方法执行之前就走他
   * 如果 return true 就放行 反之 用 request 或者 response 跳转
   * */
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("拦截器执行了");
    return false;
  }
}

写好了,但是 springMVC怎么知道拦截谁呢,springmvc.xml编写

<mvc:interceptors>
            <!-- 配置拦截器 -->
            <mvc:interceptor>
            <!-- 要拦截的具体方法 这两个只要配一个就行了 /** 所有方法拦截-->
            <mvc:mapping path="/user/**"/>
            <!-- 不要拦截的方法 -->
            <!--<mvc:exclude-mapping path="/static/**"></mvc:exclude-mapping>-->
            <!-- 配置拦截器的对象 -->
            <bean class="club.adger.myintercepter.MyInterCeptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

在这里插入图片描述
点击一下,可以看见被拦截了,一片空白
在这里插入图片描述

在这里插入图片描述
这个HandlerInterceptor有三个方法,比如没登陆就让他跳个界面嘛

在这里插入图片描述

request.getRequestDispatcher("/WEB-INF/error/error.jsp").forward(request,response);

在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值