SpringMVC拦截器

本文介绍了SpringMVC中的拦截器概念及其应用。通过自定义拦截器实现对请求的预处理和后处理,展示了如何创建并配置拦截器,以及它们在实际项目中的使用流程。

SpringMVC拦截器

拦截器(interceptor)的作用
  • SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理后处理

    将拦截器按一定的顺序连接成一条链,这条链称为拦截器(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按之前定义的顺序被调用。拦截器也是AOP思想的具体实现。

拦截器和过滤器的区别

image-20220324124133467

拦截器快速入门

自定义拦截器的步骤:

  1. 创建拦截器实现HandlerInterceptor接口

    package com.study.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @title: MyInterceptor1
     * @Author Mj
     * @Date: 2022/3/25 18:38
     * @Version 1.0
     */
    public class MyInterceptor1 implements HandlerInterceptor {
        //目标方法执行之前执行
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandler...");
            String param = request.getParameter("param");
            if ("yes".equals(param)){
                return true;
            }else {
                request.getRequestDispatcher("/error.jsp").forward(request,response);
                return false;
            }
            // return true;    //返回true表示放行,返回false表示拦截
        }
    
        //目标方法执行之后,视图对象返回之前执行
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            modelAndView.addObject("name","itheima");
            System.out.println("postHandler...");
        }
    
        //流程都执行完毕之后执行
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("afterCompletion...");
        }
    }
    
  2. 在spring-mvc.xml中配置拦截器

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    ">
    
        <!--1、mvc注解驱动-->
        <mvc:annotation-driven/>
    
        <!--2、配置视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--3、静态资源权限开放-->
        <mvc:default-servlet-handler/>
    
        <!--4、组件扫描  扫描Controller-->
        <context:component-scan base-package="com.study.controller"/>
    
    
        <!--配置拦截器-->
        <mvc:interceptors>
            <!--执行顺序和这里的配置顺序相关-->
            <mvc:interceptor>
                <!--对哪些资源执行拦截操作-->
                <mvc:mapping path="/**"/>
                <bean class="com.study.interceptor.MyInterceptor1"/>
            </mvc:interceptor>
    
            <mvc:interceptor>
                <!--对哪些资源执行拦截操作-->
                <mvc:mapping path="/**"/>
                <bean class="com.study.interceptor.MyInterceptor2"/>
            </mvc:interceptor>
        </mvc:interceptors>
    
    </beans>
    
  3. 测试拦截器的拦截效果

    package com.study.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    /**
     * @title: TargetController
     * @Author Mj
     * @Date: 2022/3/25 16:39
     * @Version 1.0
     */
    @Controller
    public class TargetController {
    
        @RequestMapping("/target")
        public ModelAndView show(){
            System.out.println("目标资源执行...");
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("name","itcast");
            modelAndView.setViewName("index");
            return modelAndView;
        }
    }
    
拦截器方法说明

image-20220325193828462

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值