12_SpringMVC_拦截器

news2024/12/23 19:05:31

  

在之前学习JAVAWEB 的时候,我们学习了过滤器的知识。过滤器的作用是保护请求的服务器资源,在请求资源被执行之前,如果请求地址符合拦截范围,则会先执行过滤器。过滤器的执行时机,是在Servlet之前执行的。但是在使用了SpringMVC后,Servlet只有一个了,也就是DisptcherServlet。那么,如果我们仍然使用过滤器来完成请求的拦截,因为过滤器是在Servlet之前执行的,就会造成,过滤器会拦截DispatcherServlet所有的请求。那么,如果我们有部分请求不想被拦截,怎么办?

拦截器使用

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

    要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。

    1.通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。

    2.通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。

拦截器和过滤器的区别

       1拦截器SpringMVC的,而过滤器是servlet的。

  2拦截器不依赖与servlet容器,由spring容器初始化,过滤器依赖与servlet容器,由servlet容器初始化。

  3拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

  4拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

  5在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

       6拦截器可以获取IOC容器中的各个bean,而过滤器就不太方便,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

定义一个拦截器

package com.msb.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /*在请求到达我们定义的handler之前工作的*/
        System.out.println("MyInterceptor preHandle");
        /*返回的是true,代表放行,可以继续到达handler*/
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor postHandle");
        /*handler 处理单元返回ModelAndView 时候进行 拦截*/
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        /*
        页面渲染完毕,但是还没有给浏览器响应数据的时候
         */
        System.out.println("MyInterceptor afterCompletion");
    }
}

springmvc.xml中注册拦截器

   <!--注册拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/login.action"/>
            <bean id="myInterceptor" class="com.msb.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

拦截器内容详解

1、preHandle方法

执行时机
    再进入控制单元方法之前执行

如何调用

按拦截器定义顺序调用

具体作用

如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去 进行处理,则返回 true。 如果程序员决定不需要再调用其他的组件去处理请求,则返回 false。

参数详解

HttpServletRequest arg0,拦截的请求的request对象

    HttpServletResponse arg1, 拦截的请求的response对象

    Object arg2       封存了单元方法对象的HandleMethod对象 

 /**
     *
     * @param request  请求对象
     * @param response 响应对象
     * @param handler  目标要调用的Handler
     * @return 返回true放行,返回false拦截
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /*在请求到达我们定义的handler之前工作的*/
        System.out.println("MyInterceptor preHandle");
        /*设置请求和响应的乱码 */
        /* request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");*/
        // 判断是否登录
        /*User user =(User) request.getSession().getAttribute("user");
        if(null == user)
            response.sendRedirect("index.jsp");
        return false;*/
        // 用户权限控制
        return true;
    }

2、postHandle方法

执行时机
    在进行数据处理和做出响应之间进行这个方法的调用

如何调用

在拦截器链内所有拦截器返成功调用

具体作用

在业务处理器处理完请求后,但是 DispatcherServlet 向客户端返回响应前被调用,

在该方法中对用户请求 request域数据进行处理。

参数详解

        HttpServletRequest arg0, 拦截的请求的request对象

        HttpServletResponse arg1, 拦截的请求的response对象

        Object arg2, 封存了单元方法对象的HandleMethod对象

        ModelAndView arg3 封存了单元方法的返回值资源路径和请求转到的Map数据 

/**
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView  controller响应的结果,视图和数据
     * @throws Exception
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor postHandle");
        /*控制数据*/
        /*Map<String, Object> map = modelAndView.getModel();
        String msg = (String)map.get("msg");
        String newMsg = msg.replaceAll("脏话", "**");
        map.put("msg", newMsg);*/
        /*控制视图*/
        /*modelAndView.setViewName("/testDemo1.jsp");*/
    }

3、afterCompletion方法

执行时机
    在进行页面渲染的时候执行
如何调用

按拦截器定义逆序调用  

具体作用

在DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

参数详解

HttpServletRequest arg0, 拦截的请求的request对象

HttpServletResponsearg1, 拦截的请求的response对象

Object arg2, 封存了单元方法对象的HandleMethod对象

Exception arg3 存储了责任链的异常信息

/**
     * 无论controller是否出现异常,都会执行的方法
     *  一般来说都做一些资源释放工作
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        /*页面渲染完毕,但是还没有给浏览器响应数据的时候*/
        System.out.println("MyInterceptor afterCompletion");
        System.out.println(ex);
    }

多个拦截器执行顺序

多个拦截器同时存在时,执行的顺序由配置顺序决定. 先配置谁, 谁就先执行.多个拦截器可以理解为拦截器栈, 先进后出(后进先出), 如图所示:

<!--注册拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/login.action"/>
            <bean id="myInterceptor1" class="com.msb.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/login.action"/>
            <bean id="myInterceptor2" class="com.msb.interceptor.MyInterceptor2"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

MyInterceptor preHandle
MyInterceptor2 preHandle
login.action
MyInterceptor2 postHandle
MyInterceptor postHandle
success.jsp 
MyInterceptor2 afterCompletion
MyInterceptor afterCompletion

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 3 技术揭秘

作者介绍 muwoo&#xff0c;前端技术专家。曾就职于蚂蚁集团&#xff0c;之前对 Vue 2.x 源码有过深层次的研究和探索&#xff0c;并在 Github 上开源了相关的技术文章&#xff1a;Vue 2.x 技术揭秘&#xff0c;目前已有超过 2k star 。 自 Vue 3 诞生以来&#xff0c;就一直关…

30 岁转行做程序员,晚了吗?

2019年&#xff0c;我从某大型国有企业正式辞职&#xff0c;告别了工作了6年的北锤小城。这时候&#xff0c;鄙人年芳30&#xff0c;曾经一批来这里奋斗的同事们&#xff0c;要么走上管理岗位、要么成家立业买房买车&#xff0c;他们是打算把一生奉献给这里的&#xff0c;然而也…

【Javascript基础】--零基础--超详细且简洁的Javascript笔记--Javascript基础知识(02)

Hello, world! 首先&#xff0c;让我们看看如何将脚本添加到网页上。 对于服务器端环境&#xff08;如 Node.js&#xff09;&#xff0c;你只需要使用诸如 "node my.js" 的命令行来执行它。 “script” 标签 比如&#xff1a; <!DOCTYPE HTML> <html>…

搭建Seata分布事务(基于Nacos注册+Mysql配置)

文章目录一&#xff1a;拉取Seata镜像二&#xff1a;运行Seata容器2.1. 容器内目录拷贝到宿主机2.2. 编辑 registry.conf 和 file.conf2. 2.1. 编辑注册中心相关文件2.2.2. 编辑Seata存储数据的相关配置文件2.3. 宿主机文件拷贝至容器内部三&#xff1a;Nacos注册中心相关配置操…

TikTok发布What‘s Next趋势报告,2023年有哪些增长机会?

获悉&#xff0c;近日TikTok for Business发布了《Whats Next 2023 TikTok 全球流行趋势报告》&#xff0c;帮助营销人员了解消费者的需求在来年将如何变化&#xff0c;以及这对他们在TikTok内外的策略将产生怎样的影响。这份报告将有趣与实用相结合&#xff0c;重点剖析了品牌…

阿里巴巴新产“Java架构核心宝典”,全是流行技术,限时开放

导言 什么是架构师&#xff1f;对于程序员来说&#xff0c;聊架构是一个永不过时的话题。实际上&#xff0c;每一家公司都有自己对架构师不同的定位&#xff0c;因为不同的公司&#xff0c;所处的阶段、业务模式以及应用场景都不一样&#xff0c;因此对架构师的要求不一样&…

直播带货不再独揽大旗,货架电商神秘崛起,链动2+1模式助力引流

​“WXG&#xff08;微信事业群&#xff09;最亮眼的业务是视频号&#xff0c;基本上是全场&#xff08;全公司&#xff09;的希望。”12月22日&#xff0c;在线上召开内部员工大会时&#xff0c;腾讯CEO马化腾再度把视频号推至C位。这句话昨天也一度冲上热搜。 马化腾在内部员…

后台Service限制

每次在后台运行时&#xff0c;应用都会消耗一部分有限的设备资源&#xff0c;例如 RAM。 这可能会影响用户体验&#xff0c;如果用户正在使用占用大量资源的应用&#xff08;例如玩游戏或观看视频&#xff09;&#xff0c;影响会尤为明显。 为了提升用户体验&#xff0c;Androi…

ESP8266-C开发-3串口下载固件失败方案

一、串口下载固件失败 以下是报错信息。 …………………………[2022-12-23 09:01:17,338][ESP8266Loader_spi[1]][espDownloader.pyo][line:351][ERROR]: Chip sync error: Failed to connect to ESP8266: Timed out waiting for packet header [2022-12-23 09:01:17,338][ESP…

Zookeeper 4 Zookeeper JavaAPI 操作 4.1 Curator 介绍 4.2 Curator API 常用操作【建立连接】

Zookeeper 【黑马程序员Zookeeper视频教程&#xff0c;快速入门zookeeper技术】 文章目录Zookeeper4 Zookeeper JavaAPI 操作4.1 Curator 介绍4.1.1 Curator 介绍4.2 Curator API 常用操作4.2.1 Curator API 常用操作4.2.2 建立连接4 Zookeeper JavaAPI 操作 4.1 Curator 介绍…

使用形态学处理相关算法对芯片电路图焊接锡点缺陷进行检测

up目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 当前我国信息科技的发展&#xff0c; 产业界自动化生产水平越来越高。 具体在电子产品行业&#xff0c; 随着精细化和自动化的发展&#xff0c; 电子产品的焊点质量的好坏&#xff0c; 深刻地影响着产品成品的质…

Unity下如何实现RTMP或RTSP流播放和录制

技术背景 在探讨Unity平台RTMP或RTSP直播流数据播放和录制之前&#xff0c;我们先简单回顾下RTSP或RTMP直播流数据在Unity平台的播放流程&#xff1a; 通过Native RTSP或RTSP直播播放SDK回调RGB/YUV420/NV12等其中的一种未压缩的图像格式&#xff1b;Unity下创建相应的RGB/YU…

工作几年后想转行学编程,如何操作才靠谱?

30岁转行来得及么&#xff1f;继结婚、生子、就业、买房后&#xff0c;又一个对30岁的灵魂拷问来了。 在一档综艺节目里&#xff0c;有位年过30的“实习生”为了能让孩子有更好的生活条件、也为了自己的事业与发展&#xff0c;她选择在而立之年放下自己曾经所擅长的&#xff0c…

微信键盘终于正式发布,张小龙说:其目的并不是为了抢夺输入法市场

自从2021年1月份&#xff0c;张小龙在微信公开课透露&#xff1a;微信将上线属于自己的专属输入法&#xff0c;到现在已经快2年过了。 今天终于正式发布了&#xff0c;下面我们一起来体验下。 1、安装 打开App Store&#xff0c;输入“微信键盘”&#xff0c;点击获取就可以…

刷爆力扣之字符串中的单词数

刷爆力扣之字符串中的单词数 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#…

STATIC和静态分析的必要性

​有一款正常工作的软件。那么可以说正常工作的软件都是好软件吗&#xff1f;在漫威的《黑豹》电影中有一个场景我深深地看过。 <图 1> 电影《黑豹》的场景 就算做的好&#xff0c;也有进步的空间! 我认为好的软件也是如此。 即使它可以工作并且没有问题&#xff0c;但总…

Vue2.x中的Vuex

目录 一、vuex是什么 1.1、概念 1.2、Github地址 1.3、使用场景 1.4、同胞传值 1.5、Vuex工作原理 1.6、搭建Vuex环境 二、求和案例 2.1、getters用法 2.2、mapState与mapGetters 2.3、mapActions与mapMutations 2.4、Vuex模块化命名空间namespace 2.5、头插人员案…

Nacos 寻址机制

目录 1. 什么是寻址机制 2. 源码讲解 MemberLookup AbstractMemberLookup 2.1 单机寻址 2.2. 文件寻址 2.3 地址服务器寻址 1. 什么是寻址机制 假设存在一个 Nacos 集群&#xff0c;其内部具有 A , B , C 三个节点。 客户端如何决定向集群中的哪个节点发送请求 在 appl…

基于Springboot+Mybatis+mysql+element-vue高校就业管理系统

基于SpringbootMybatismysqlelement-vue高校就业管理系统一、系统介绍二、功能展示1.用户登陆注册2.个人信息(学生端)3.查看企业岗位信息&#xff08;学生端&#xff09;4.我的应聘(学生端)5.学生信息管理&#xff08;辅导员&#xff09;6.三方协议书审核&#xff08;辅导员&am…

向用户展示推荐算法,TikTok主动“透明化”

获悉&#xff0c;近日TikTok宣布推出一项新功能&#xff0c;用户可以查看推荐主页&#xff08;For You&#xff09;中某个视频被推荐的原因&#xff0c;这一功能让用户拥有了更多的知情权&#xff0c;让TikTok的算法变得更透明化。新功能新功能推出后&#xff0c;用户可以在视频…