SpringMVC_23_自定义的拦截器以及拦截器的配置

自定义的拦截器

  • Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口

    1. preHandler():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器对进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。

      /**
       * 该方法在目标方法之前被调用。
       * 若返回值为true,则继续调用后续的拦截器和目标方法
       * 若返回值为false,则不会再调用后续的拦截器和目标方法
       *
       * 可以考虑做权限。日志,事务等。
       */
      
    2. postHandler():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求request进行处理。

      /**
       * 调用目标方法之后,但渲染视图之前。
       * 可以对请求域中的属性或视图做出修改。
       */
      
    3. afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

      /**
       * 渲染视图之后被调用。释放资源。
       */
      

举个例子:

第一步:创建一个包interceptor用来存放我们自定义的拦截器,并且创建一个FirstInterceptor拦截器类

在这里插入图片描述

FirstInterceptor.java

package com.springmvc.interceptors;

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

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

public class FirstInterceptor implements HandlerInterceptor {


    /**
     * 该方法在目标方法之前被调用。
     * 若返回值为true,则继续调用后续的拦截器和目标方法
     * 若返回值为false,则不会再调用后续的拦截器和目标方法
     *
     * 可以考虑做权限。日志,事务等。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("[FirstInterceptor] preHandle");

        return true;
    }

    /**
     * 调用目标方法之后,但渲染视图之前。
     * 可以对请求域中的属性或视图做出修改。
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("[FirstInterceptor] postHandle");
    }

    /**
     * 渲染视图之后被调用。释放资源。
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("[FirstInterceptor] afterCompletion");
    }
}

第二步:在Springmvc.xml配置这个拦截器

<mvc:interceptors>
    <!--配置自定义的拦截器-->
    <bean class="com.springmvc.interceptors.FirstInterceptor"></bean>
</mvc:interceptors>

第三步:直接运行之前的界面并且点击任意的< a>标签

在这里插入图片描述

tips:

在这里插入图片描述

拦截器的配置

1.首先我们在interceptor包中新建了一个拦截器SecondInterceptor

在这里插入图片描述

SecondInterceptor.java

package com.springmvc.interceptors;

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

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

public class SecondInterceptor implements HandlerInterceptor {


    /**
     * 该方法在目标方法之前被调用。
     * 若返回值为true,则继续调用后续的拦截器和目标方法
     * 若返回值为false,则不会再调用后续的拦截器和目标方法
     *
     * 可以考虑做权限。日志,事务等。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("[SecondInterceptor] preHandle");

        return true;
    }

    /**
     * 调用目标方法之后,但渲染视图之前。
     * 可以对请求域中的属性或视图做出修改。
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("[SecondInterceptor] postHandle");
    }

    /**
     * 渲染视图之后被调用。释放资源。
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("[SecondInterceptor] afterCompletion");
    }
}

2.我们想做的是SecondInterceptor只会拦截/emps这个handler方法那么需要这样配置

<!--配置LocaleChanceInterceptor-->
<mvc:interceptors>
    
    <!--配置自定义的拦截器-->
    <bean class="com.springmvc.interceptors.FirstInterceptor"></bean>

    <!--配置拦截器(不)作用的路径-->
    <!--这样配置就能使得SecondInterceptor定向拦截/emps请求-->
    <mvc:interceptor>
        <mvc:mapping path="/emps"/>
        <bean class="com.springmvc.interceptors.SecondInterceptor"></bean>
    </mvc:interceptor>


</mvc:interceptors>

3.点击一个有/emps的请求的< a>标签,这样会被FirstInterceptor和SecondInterceptor拦截

在这里插入图片描述

4.点击一个没有/emps的请求的< a>标签,这样只会被FirstInterceptor拦截

在这里插入图片描述

tips:

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42036647/article/details/86178803