小言_互联网的博客

SpringMVC -- 拦截器理解

271人阅读  评论(0)

SpringMVC – 拦截器理解

Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置

定义一个拦截器可以通过两种方式

  • 实现 HandlerInterceptor 接口继承 HandlerInterceptor 接口的实现类来定义
  • 另一种是通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类

实现 HandlerInterceptor 接口


package com.springTest.interceptor;


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

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

public class TestInterceptor implements HandlerInterceptor {
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception ex)
                                 throws Exception {

        System.out.println("afterCompletion方法在控制器的处理请求方法执行完成后执行,即视图渲染结束之后执行");
    }
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler,
                           ModelAndView modelAndView)
                            throws Exception {

        System.out.println("postHandle方法在控制器的处理请求方法调用之后,解析视图之前执行");
    }

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler)
                            throws Exception {

        System.out.println("preHandle方法在控制器的处理请求方法调用之后,解析视图之前执行");
        return false;
    }
}

实现了 HandlerInterceptor 接口,并实现了接口中的 3 个方法。这 3 个方法的描述如下。

  • preHandle 方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
  • postHandle 方法:该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。
  • afterCompletion 方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。

SpringMVC配置文件中配置拦截器

<?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" xmlns:aop="http://www.springframework.org/schema/aop"
       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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">


    <!--springmvc扫包-->
    <context:component-scan base-package="com.springTest.Controller"/>
    <!--开启注解支持开发-->
    <mvc:annotation-driven/>
    <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 配置拦截器作用的路径,扫全局 -->
            <mvc:mapping path="/**" />
            <!-- 配置不需要拦截作用的路径,放过登录 -->
            <mvc:exclude-mapping path="/user/login" />
            <!-- 定义<mvc:interceptor>元素中,表示匹配指定路径的请求才进行拦截 -->
            <bean class="com.springTest.interceptor.TestInterceptor" />
        </mvc:interceptor>

    </mvc:interceptors>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>




</beans>

在上述示例代码中,

  • <mvc:interceptors> 元素用于配置一组拦截器,其子元素 定义的是全局拦截器,即拦截所有的请求。

  • <mvc:interceptor> 元素中定义的是指定路径的拦截器

  • 子元素 <mvc:mapping> 用于配置拦截器作用的路径,该路径在其属性 path 中定义。

  • path 的属性值“/**”表示拦截所有路径,“/gotoTest”表示拦截所有以“/gotoTest”结尾的路径。如果在请求路径中包含不需要拦截的内容

  • <mvc:exclude-mapping> 子元素表示不拦截的请求。

需要注意的是,<mvc:interceptor> 元素的子元素必须按照 <mvc:mapping…/>、<mvc:exclude-mapping…/>、<bean…/> 的顺序配置。


效果

亲测,出了拦截器登录的请求,全局任何请求都会进拦截器,哪怕是默认请求,不过在配置文件中定义拦截使用比较少,因为拦截器有pre拦截,所以可以在一开始根据请求,定义true或者false就可以起到请求效果。


多重拦截就不再写了,效果都是一样的,写多个拦截器,和多个不拦截的拦截放行

直接上代码吧



原理就是:

进入第一个拦截一般用于注册登录,然后你想再拦截它一些东西,再定义一个拦截,由于我没有在类上面写@RequestMapping,所以只有一个根请求
/register。所以对于注册再拦截,然后bean里面定义的拦截,可以在对应的方法里面添加拦截即可


转载:https://blog.csdn.net/weixin_44550490/article/details/101027435
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场