SpringMVC_拦截器 interceptor

一:拦截器

拦截器是SpringMvc中提供的一种于 Filter 类似的过滤器技术,但拦截器智能拦截Controller的请求,而Filter 可以过滤所有的请求

创建一个拦截器

1:创建一个普通类,实现HandlerInterceptor接口

package com.doaoao.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行拦截器中的parHandle方法");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行拦截器中的postHandler方法");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("执行拦截器中的afterCompletion方法");
    }
}

2:配置springmvc.xml中的内容,/** 表示拦截所有的Controller

    <!--注册拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.doaoao.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

3:创建一个测试用的 controller 

package com.doaoao.interceptor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class testController {
    @RequestMapping("/test.do")
    public ModelAndView test(){
        ModelAndView mv = new ModelAndView();
        System.out.println("执行 test 方法");     mv.serViewName("result")
        return mv;
    }
}

# 当执行后后输出:

执行拦截器中的preHandle方法
执行test方法
执行拦截器中的postHandle方法
执行拦截器中的afterCompletion方法

# 拦截器中的执行顺序

浏览器 -> preHandle -> handler -> postHandle -> acterCompletion -> 浏览器

...

二:多个拦截器

定义多个拦截器与上方方法一样,先定义一个类实现接口 HandlerInterceptor,再在配置文中注册拦截器(注册在前的拦截器会优先执行)

1:定义第二个拦截器

public class MyInterceptor2 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行拦截器2中的parHandle方法");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行拦截器2中的postHandler方法");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("执行拦截器2中的afterCompletion方法");
    }
}

2:在配置文件springmvc.xml中注册拦截器

    <!--注册拦截器1-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.doaoao.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

    <!--注册拦截器2-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.doaoao.interceptor.MyInterceptor2"/>
        </mvc:interceptor>
    </mvc:interceptors>

 # 执行后的输出

执行拦截器中的preHandle方法
执行拦截器2中的preHandle方法
执行test方法
执行拦截器2中的postHandle方法
执行拦截器中的postHandle方法
执行拦截器2中的afterCompletion方法
执行拦截器中的afterCompletion方法

 # 多个拦截器的执行顺序

浏览器 -> preHandler(拦截器1) -> preHandler(拦截器2) -> handler -> postHandle(拦截器2) -> postHandle(拦截器1) -> afterCompletion1 -> afterCompletion2->浏览器

...

本笔记参考自:小猴子老师教程 http://www.monkey1024.com

原文地址:https://www.cnblogs.com/Doaoao/p/10695476.html

时间: 2024-10-10 04:21:21

SpringMVC_拦截器 interceptor的相关文章

Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行

在AbstractConfigurationProvider类中loadSources方法会将所有的source进行封装成SourceRunner放到了Map<String, SourceRunner> sourceRunnerMap之中.相关代码如下: 1 Map<String, String> selectorConfig = context.getSubProperties( 2 BasicConfigurationConstants.CONFIG_SOURCE_CHANNE

Kafka producer拦截器(interceptor)

Producer拦截器(interceptor)是个相当新的功能,它和consumer端interceptor是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑. 对于producer而言,interceptor使得用户在消息发送前以及producer回调逻辑前有机会对消息做一些定制化需求,比如修改消息等.同时,producer允许用户指定多个interceptor按序作用于同一条消息从而形成一个拦截链(interceptor chain).Intercetpor

详述 Spring MVC 框架中拦截器 Interceptor 的使用方法

1 前言 昨天新接了一个需要,"拦截 XXX,然后 OOO",好吧,说白了就是要用拦截器干点事(实现一个具体的功能).之前,也在网络上搜了很多关于Interceptor的文章,但感觉内容都大同小异,而且知识点零零散散,不太方便阅读.因此,正好借此机会,整理一篇关于拦截器的文章,在此分享给大家,以供大家参考阅读. 2 拦截器 2.1 概念 Java 里的拦截器是动态拦截 action 调用的对象.它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也可以在一个

struts2拦截器interceptor的三种配置方法

struts2拦截器interceptor的三种配置方法方法1. 普通配置法 <struts>     <package name="struts2" extends="struts-default">         <interceptors>             <interceptor name="myInterceptor" class="edu.hust.interceptor.

Struts拦截器Interceptor

Struts2 拦截器 [Interceptor] 拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部.拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作. 每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面. 如何自定义一个拦截器? 自定义一个拦截器需要三步: 1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类. 2 在strutx.xml中

Flume 拦截器(interceptor)详解

flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截器都可以进行转换或者删除这些事件.每个拦截器只处理同一个source接收到的事件.可以自定义拦截器.2.flume内置的拦截器 2.1 时间戳拦截器flume中一个最经常使用的拦截器 ,该拦截器的作用是将时间戳插入到flume的事件报头中.如果不使用任何拦截器,flume接受到的只有message.

五 、 Kafka producer 拦截器(interceptor) 和 六 、Kafka Streaming案例

五 Kafka producer 拦截器(interceptor) 5.1 拦截器原理 Producer 拦截器(interceptor)是在 Kafka 0.10 版本被引入的,主要用于实现 clients 端的定 制化控制逻辑. 对于 producer 而言,interceptor 使得用户在消息发送前以及 producer 回调逻辑前有机会 对消息做一些定制化需求,比如修改消息等.同时,producer 允许用户指定多个 interceptor 按序作用于同一条消息从而形成一个拦截链(in

拦截器interceptor

拦截器interceptor 配置 <mvc:interceptors> <mvc:interceptor> <!--/**回处理/后面的所有请求--> <mvc:mapping path="/**"/> <bean class="cn.pinked.config.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> 拦截器

Struts2自定义拦截器Interceptor以及拦截器登录实例

1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor{ private static final long serialVersionUID = 1L; public void destroy() { } public void init() {} public String intercept(ActionInvocation arg0) throws