亲宝软件园·资讯

展开

SpringMVC拦截器

llp1110 人气:0

1.什么是拦截器

说明

自定义拦截器的三个方法

2.自定义拦截器执行流程图

自定义拦截器执行流程说明

3.自定义拦截器应用实例

1.快速入门

● 应用实例需求

完成一个自定义拦截器,学习一下如何配置拦截器和拦截器的运行流程

● 应用实例-代码实现

1.自定义拦截器

/**
 * 自定义拦截器
 */
@Component
public class MyInterceptor01 implements HandlerInterceptor {
    /**
     * 1.preHandle 方法在目标方法执行前被执行
     * 2.如果返回fasle则不在执行目标方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor01 --preHandle");
        return true;
    }
    /**
     * 1. 在目标方法执行后,会执行postHandle
     * 2. 该方法可以获取到 目标方法,返回的ModelAndView对象
     * @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("MyInterceptor01-postHandle");
    }
    /**
     *1. afterCompletion() 在视图渲染后被执行, 这里可以进行资源清理工作
     * @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("MyInterceptor01-afterCompletion");
    }
}

2.配置拦截器

拦截配置有三种方式

(1)不指定拦截规则,默认拦截所有

<!--配置自定义拦截器-spring配置文件-->
<mvc:interceptors>
    <!--第一种方式,不指定拦截规则默认拦截所有请求-->
    <ref bean="myInterceptor01"></ref>
</mvc:interceptors>

(2)指定明确的拦截路径

<!--配置自定义拦截器-spring配置文件-->
<mvc:interceptors>
    <!--第一种方式,不指定拦截规则默认拦截所有请求-->
    <!--<ref bean="myInterceptor01"></ref>-->
    <!--第二种指定拦截路径-->
    <mvc:interceptor>
        <mvc:mapping path="/hi"/>
        <ref bean="myInterceptor01"/>
    </mvc:interceptor>
</mvc:interceptors>

(3)通配符方式,也可用于指定不拦截路径

    <!--配置自定义拦截器-spring配置文件-->
    <mvc:interceptors>
        <!--第一种方式,不指定拦截规则默认拦截所有请求-->
        <!--<ref bean="myInterceptor01"></ref>-->
        <!--第二种指定拦截路径-->
  <!--      <mvc:interceptor>
            <mvc:mapping path="/hi"/>
            <ref bean="myInterceptor01"/>
        </mvc:interceptor>-->
      <mvc:interceptor>
          <!--通配符方式 表示拦截 /h 打头的路径-->
          <mvc:mapping path="/h*"/>
          <!--/hello不拦截-->
          <mvc:exclude-mapping path="/hello"/>
          <!--指定对哪个拦截器配置-->
          <ref bean="myInterceptor01"/>
      </mvc:interceptor>
    </mvc:interceptors>

3.创建FurnHandler.java

@Controller
public class FurnHandler {
    @RequestMapping(value = "/hi")
    public String hi(User user) {
        System.out.println("---FurnHandler--hi()---");
        return "success";
    }
    @RequestMapping(value = "/hello")
    public String hello() {
        System.out.println("---FurnHandler--hello()---");
        return "success";
    }
    @RequestMapping(value = "/ok")
    public String ok() {
        System.out.println("---FurnHandler--ok()---");
        return "success";
    }
}

4.interceptor.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试自定义拦截器</title>
</head>
<body>
<h1>测试自定义拦截器</h1>
<a href="<%=request.getContextPath()%>/hi" rel="external nofollow" >测试自定义拦截器-hi</a><br><br>
<a href="<%=request.getContextPath()%>/hello" rel="external nofollow" >测试自定义拦截器-hello</a><br/><br/>
<a href="<%=request.getContextPath()%>/ok" rel="external nofollow" >测试自定义拦截器-ok</a><br><br>
</body>
</html>

5.测试

2.注意事项和细节

1、默认配置是都所有的目标方法都进行拦截, 也可以指定拦截目标方法, 比如只是拦截 hi

<mvc:interceptor> 
    <mvc:mapping path="/hi"/> 
    <ref bean="myInterceptor01"/> 
</mvc:interceptor>

2、mvc:mapping 支持通配符, 同时指定不对哪些目标方法进行拦截

<mvc:interceptor> 
    <mvc:mapping path="/h*"/> 
    <mvc:exclude-mapping path="/hello"/> 
    <ref bean="myInterceptor01"/> 
</mvc:interceptor>

3、拦截器需要配置才生效,不配置是不生效的.

4、如果 preHandler() 方法返回了 false, 就不会执行目标方法(前提是你的目标方法被拦截 了), 程序员可以在这里根据业务需要指定跳转页面.

3.Debug执行流程

4.多个拦截器

1.多个拦截器执行流程示意图

执行流程可以参考filter过滤器,执行顺序根据配置的先后顺序

2.应用实例

代码实现

新增拦截器

@Component
public class MyInterceptor02 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor02-preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor02-postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor02-afterCompletion");
    }
}

配置拦截器

  <!--配置自定义拦截器-spring配置文件-->
  <mvc:interceptors>
      <!--第一种方式,不指定拦截规则默认拦截所有请求-->
      <!--<ref bean="myInterceptor01"></ref>-->
      <!--第二种指定拦截路径-->
<!--      <mvc:interceptor>
          <mvc:mapping path="/hi"/>
          <ref bean="myInterceptor01"/>
      </mvc:interceptor>-->
    <mvc:interceptor>
        <!--通配符方式 表示拦截 /h 打头的路径-->
        <mvc:mapping path="/h*"/>
        <!--/hello不拦截-->
        <mvc:exclude-mapping path="/hello"/>
        <!--指定对哪个拦截器配置-->
        <ref bean="myInterceptor01"/>
    </mvc:interceptor>
      <mvc:interceptor>
          <mvc:mapping path="/hi"/>
          <ref bean="myInterceptor02"/>
      </mvc:interceptor>
  </mvc:interceptors>

这里我们定义了两个拦截器myInterceptor01和myInterceptor02,两个拦截器都会对ip:port/工程路径/hi的请求进行拦截,执行结果如下图所示:

执行流程说明:拦截器的执行先后顺序根据配置的先后顺序执行

3.主要事项和细节

在实际开发中我们常用拦截器对登录进行验证

加载全部内容

相关教程
猜你喜欢
用户评论