在Spring MVC中配置自定义拦截器的确切方法。。

自定义拦截器

  • 什么是拦截器

1、在Spring MVC中可以使用拦截器对方法请求进行拦截处理,各位程序员可以自定义拦截器来实现特定的功能。

2、拦截器必须实现 HandlerInterceptor 接口。

  • 自定义拦截器的三个方法

1、preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求的 request

进行处理。

2、postHandle():这个方法在目标方法处理完请求后执行。

3、afterCompIetion():这个方法在完全处理完请求后被调用,可以在该方法中进行一些资源的释放/清理等操作。

自定义拦截器执行流程分析图

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

1、如果 preHandle 方法 返回 false ,则就不在执行目标方法,可以在此之地那个返回页面。

2、postHandle 在目标方法被执行后执行,可以在方法中访问到目标方法返回的 ModelAndView 对象。

3、若 preHandle 返回 true,则 afterCompIetion 方法 在渲染视图之后被执行。

4、若 preHandle 返回 false,则 afterCompIetion 方法 不会被调用。

5、在配置拦截器时,可以指定该拦截器对哪些请求生效,哪些请求不生效。

自定义拦截器应用实例

例:如何配置拦截器以及拦截器的运行流程

  • 实例代码

这里让类 实现 HandlerInterceptor 接口,来获取 HandlerInterceptor() 中的三个执行方法。

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

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

//配置一个 @Component交给Spring MVC进行管理
@Component
public class MyInterceptor01 implements HandlerInterceptor {
    /**
     *1.preHandle() 在目标方法执行前被执行
     * 2.如果preHandle() 返回false,不在执行目标方法
     * 3.该方法可以获取到request,response,handler
     * 4.这里根据业务,可以进行拦截,并指定需要跳转到哪个页面
     */
    @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() 在视图从渲染后被执行
     * 2.可以执行资源处理
     * @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()");
    }
}

接下来我们配置需要执行的目标方法。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

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

    @RequestMapping(value = "/hello")
    public String hello(){
        System.out.println("--FurnHandler--hello()");
        return "success";
    }
}

随后我们需要在Spring的 .xml 配置文件中配置拦截器

<!--配置自定义拦截器-->
    <mvc:interceptors>
        <!--解读:
        1.第一种配置方式
        2.ref 引用到对应的MyInterceptor01
        3.这种方式,会拦截目标方法
        -->
        <ref bean="myInterceptor01"/>
    </mvc:interceptors>

还有两种其余的方法!!!

<!--配置自定义拦截器-->
    <mvc:interceptors>
        <!--解读:
        默认配置是都所有的目标方法都进行拦截, 也可以指定拦截目标方法, 比如只是拦截 hi
        1.第二种配置方式
        2.<mvc:mapping path="/hi"/> 指定要拦截的路径
        3.<ref bean="myInterceptor01"/> 指定对那个拦截器进行配置
        -->
        <!--<mvc:interceptor>-->
        <!--    <mvc:mapping path="/hi"/>-->
        <!--    <ref bean="myInterceptor01"/>-->
        <!--</mvc:interceptor>-->

        <!--
        mvc:mapping 支持通配符, 同时指定不对哪些目标方法进行拦截
        解读:
        1.第三种配置方式
        2.<mvc:mapping path="/h*"/> 通配符方式 拦截‘h’打头的文件
        3.<mvc:exclude-mapping path="/hello"/> 指定‘/hello’不拦截
        4.<ref bean="myInterceptor01"/> 指定对那个拦截器进行拦截
        -->
        <mvc:interceptor>
            <mvc:mapping path="/h*"/>
            <mvc:exclude-mapping path="/hello"/>
            <ref bean="myInterceptor01"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/h*"/>
            <ref bean="myInterceptor02"/>
        </mvc:interceptor>
    </mvc:interceptors>

最后完成对客户端页面的请求。

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

学习 Java 的小伙伴也可以用 Postman的方式进行测试,对后端小伙伴也会有很大的帮助的,下一期再见。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻鱼辣椒️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值