学习SpringMVC(3)——拦截器

学习SpringMVC(3)——拦截器

1、拦截器概述

1)SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术

2)可以定义拦截器链,拦截器链就是拦截器按照一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按照定义的顺序执行

3)拦截器和过滤器的功能比较类似,但是有区别:

     a.过滤器时Servlet规范的一部分,任何框架都可以使用过滤器的技术

     b.拦截器时SpringMVC框架独有的,只能在SpringMVC框架中使用

     c.过滤器配置了/*,可以拦截任何资源

     d.拦截器只对控制器中的方法进行拦截

4)拦截器也是AOP思想的一种实现方式

5)想要自定义拦截器,需要实现HandlerInterceptor接口

2、自定义拦截器步骤

1)创建类,实现HandlerInterceptor接口

HandlerInterceptor 接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。

preHandle方法是controller方法执行前拦截的方法
 

1. 可以使用request或者response跳转到指定的页面

2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。

3. return false不放行,不会执行controller中的方法。

postHandle是controller方法执行后执行的方法,在JSP视图执行前。

1. 可以使用request或者response跳转到指定的页面

2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。

postHandle方法是在JSP执行后执行

1. request或者response不能再跳转页面了

public class MyIntercepor 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("拦截器执行了。。。前");
        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("拦截器执行了。。。后");
    }

    /**
     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
     * @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("拦截器执行了...最后");
    }

2)在springmvc.xml中配置拦截器

<mvc:interceptors>
    <mvc:interceptor>
        <!-- 要拦截的方法 -->
        <mvc:mapping path="/user/*"/>
        <!-- 配置拦截器对象 -->
        <bean class="interceptor.MyIntercepor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

3、配置多个拦截器

1)再编写一个相同的拦截器

2)在springmvc.xml中配置拦截器

<mvc:interceptors>
    <mvc:interceptor>
        <!-- 要拦截的方法 -->
        <mvc:mapping path="/user/*"/>
        <!-- 配置拦截器对象 -->
        <bean class="interceptor.MyIntercepor1"></bean>
    </mvc:interceptor>
    <!-- 第二个拦截器在这里配置-->
    <mvc:interceptor>
        <!-- 要拦截的方法 -->
        <mvc:mapping path="/user/*"/>
        <!-- 配置拦截器对象 -->
        <bean class="interceptor.MyIntercepor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

3)执行顺序

拦截器执行了。。。前11111
拦截器执行了。。。前222222
控制器执行了
拦截器执行了。。。后222222
拦截器执行了。。。后111111
页面也执行了
拦截器执行了...最后2222222
拦截器执行了...最后111111

注意:在我测试的时候我用<mvc:resources>不拦截静态资源居然不管用,也不知道是怎么回事,希望有大神指正下应该怎么做

<!-- 对静态资源文件的访问-->
<mvc:resources mapping="/images/**"  location="/images/"/> 
<mvc:resources mapping="/css/**"  location="/css/" />
<mvc:resources mapping="/js/**"  location="/js/" /> 
<mvc:resources mapping="/favicon.ico"  location="favicon.ico" />

所以我只好在web.xml进行了对静态资源不拦截的配置

    <!-- 不拦截静态文件 -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/js/*</url-pattern>
        <url-pattern>/css/*</url-pattern>
        <url-pattern>/images/*</url-pattern>
        <url-pattern>/fonts/*</url-pattern>
    </servlet-mapping>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值