美文网首页
SpringMVC-拦截器

SpringMVC-拦截器

作者: acooler15 | 来源:发表于2017-08-23 20:45 被阅读0次



    1、定义

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


    2、定义拦截器

    2.1、定义一个类

    实现HandlerInterceptor接口,如下:

    public class Interceptor1 implements HandlerInterceptor {
    
        /**
         * controller执行前调用此方法
         * 返回true表示继续执行,返回false中止执行
         * 这里可以加入登录校验、权限拦截等
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            System.out.println("Interceptor1 preHandle......");
            // 在handle执行之前执行此方法。
            //返回值:如果返回true,放行
            //返回值:如果返回false,拦截
            return true;
        }
    
        /**
         * controller执行后但未返回视图前调用此方法
         * 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            //handle执行之后,返回ModelAndView之前。
            System.out.println("Interceptor1 postHandle......");
        }
    
        /**
         * controller执行后且视图返回后调用此方法
         * 这里可得到执行controller时的异常信息
         * 这里可记录操作日志,资源清理等
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
            // 返回ModelAndView之后。
            //可以在此处理异常
            System.out.println("Interceptor1 afterCompletion......");
        }
    

    2.2、拦截器配置

    2.2.1、 针对某种mapping配置

    在springmvc配置文件中:

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
      <property name="interceptors">
        <list>
            <ref bean="handlerInterceptor1"/>
            <ref bean="handlerInterceptor2"/>
        </list>
      </property>
    </bean>
    <bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
    <bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>
    

    2.2.2、配置全局拦截器

    在springmvc配置文件中:

    <!-- 配置拦截器 -->
    <mvc:interceptors>
      <!-- 按照配置的顺序执行 -->
      <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <!-- 排除对js的拦截-->
        <mvc:exclude-mapping path="/**/*.js"/>
        <bean class="com.itheima.springmvc.interceptor.Interceptor1"></bean>
      </mvc:interceptor>
      <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.itheima.springmvc.interceptor.Interceptor2"></bean>
      </mvc:interceptor>
    </mvc:interceptors>
    

    2.3、拦截器总结

    preHandle按拦截器定义顺序调用
    postHandler按拦截器定义逆序调用
    afterCompletion按拦截器定义逆序调用

    postHandler在拦截器链内所有拦截器返回成功时调用
    afterCompletion只有preHandle返回true才调用

    2.4、防止拦截静态资源

    方案二方案三只支持不在/WEB-INF/下的静态资源

    2.4.1、方案一

    在拦截器配置中添加<mvc:exclude-mapping path="/**/*.js"/>
    如下:

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <!--spring-mvc3.0以后才支持,spring-mvc3.0不支持-->
            <mvc:exclude-mapping path="/**/*.js"/>
            <bean class="cn.itheima.springmvc.interceptor.Interceptor1"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
    

    2.4.2、方案二

    在web.xml中对DispatcherServlet添加:

    <servlet-mapping>
      <servlet-name>default</servlet-name>
      <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>default</servlet-name>
      <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    

    2.4.3、方案三

    在springmvc配置文件中添加:

    <!-- spring-mvc3.0后推荐 -->
    <mvc:default-servlet-handler/>
    

    2.4.4、方案四

    配置拦截器只拦截*.do或者*.action等,只拦截请求不拦截静态资源。

    <!-- 配置拦截器 -->
    <mvc:interceptors>
      <!-- 按照配置的顺序执行 -->
      <mvc:interceptor>
        <mvc:mapping path="/**/*.do"/>
        <mvc:mapping path="/**/*.action"/>
        <bean class="com.itheima.springmvc.interceptor.Interceptor1"></bean>
      </mvc:interceptor>
      <mvc:interceptor>
        <mvc:mapping path="/**/*.do"/>
        <mvc:mapping path="/**/*.action"/>
        <bean class="com.itheima.springmvc.interceptor.Interceptor2"></bean>
      </mvc:interceptor>
    </mvc:interceptors>
    

    相关文章

      网友评论

          本文标题:SpringMVC-拦截器

          本文链接:https://www.haomeiwen.com/subject/rgpjdxtx.html