欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringMvc 拦截器

程序员文章站 2023-11-08 13:47:04
SpringMvc 拦截器介绍 SpringMVC拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与servlet中的Filter。 SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor来实现的。 在SpringMVC中定 ......

springmvc 拦截器介绍

  • springmvc拦截器(interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与servlet中的filter
  • springmvc 中的interceptor 拦截请求是通过handlerinterceptor来实现的。
  • springmvc中定义一个interceptor非常简单,主要有4种方式:

    1)实现spring的handlerinterceptor接口;

    2)继承实现了handlerinterceptor接口的类,比如spring 已经提供的实现了handlerinterceptor 接口的抽象类handlerinterceptoradapter;

    3)实现spring的webrequestinterceptor接口;

    4)继承实现了webrequestinterceptor的类;

定义拦截器

实现handlerintercepter接口:

public class myhandlerintercepter1 implements handlerinterceptor{

    //handler执行前调用
    //应用场景:登录认证、身份授权
    //返回值为true则是放行,为false是不放行
    @override
    public boolean prehandle(httpservletrequest request,
            httpservletresponse response, object handler) throws exception {
        
        return false;
    }

    //进入handler开始执行,并且在返回modelandview之前调用
    //应用场景:对modelandview对象操作,可以把公共模型数据传到前台,可以统一指定视图
    @override
    public void posthandle(httpservletrequest request,
            httpservletresponse response, object handler,
            modelandview modelandview) throws exception {
        
    }
    //执行完handler之后调用
    //应用场景:统一异常处理、统一日志处理
    @override
    public void aftercompletion(httpservletrequest request,
            httpservletresponse response, object handler, exception ex)
            throws exception {
        
    }

}

配置拦截器

  springmvc 拦截器是绑定在handlermapping中的。即:如果某个handlermapping中配置拦截,则该handlermapping映射成功的handler会使用该拦截器。

针对单个handlermapping配置

<bean class="org.springframework.web.servlet.handler.beannameurlhandlermapping">
    <property name="interceptors">
        <list>
            <ref bean="interceptor" />
        </list>
    </property>
</bean>
<bean id="interceptor" class="com.cyb.ssm.interceptor.myhandlerinterceptor" />

全局拦截器配置(推荐)

  springmvc的全局拦截器配置,其实是把配置的拦截器注入到每个已初始化的handlermapping中了。

<!-- 配置全局mapping的拦截器 -->
<mvc:interceptors>
     <!-- 公共拦截器可以拦截所有请求,而且可以有多个 -->
     <bean class="com.cyb.ssm.interceptor.myhandlerinterceptor1" />
    <bean class="com.cyb.ssm.interceptor.myhandlerinterceptor2" />
    <!-- 如果有多个拦截器,则按照顺序进行配置 -->
    <mvc:interceptor>
        <!-- /**表示所有url和子url路径 -->
        <mvc:mapping path="/test/**" />
         <!-- 特定请求的拦截器只能有一个 -->
        <bean class="com.cyb.ssm.interceptor.myhandlerinterceptor3" />
    </mvc:interceptor>
</mvc:interceptors>

多拦截器拦截规则

  如果有多个拦截器,那么配置到springmvc.xml中最上面的拦截器,拦截优先级最高