SpringMVC(五)之拦截器

spring mvc xml配置拦截器 NULL 博文链接:https://hw1287789687.iteye.com/blog/2046621 立即下载

转载自《SpringMVC拦截器的使用详解》

拦截器简介

Spring MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

常见应用场景

1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
5、OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。

本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。

SpringMVC的默认控制器

1、DispatcherServlet

SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet。DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理。 所以我们现在web.xml中加入以下配置:

<servlet>  
  <servlet-name>springMybatis</servlet-name>  
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  <load-on-startup>1</load-on-startup>  
</servlet>  
<servlet-mapping>  
  <servlet-name>springMybatis</servlet-name>  
  <!-- 所有的的请求,都会被DispatcherServlet处理 -->  
  <url-pattern>/</url-pattern>  
</servlet-mapping>  

初始化 DispatcherServlet时,该框架在 web应用程序WEB-INF目录中寻找一个名为[servlet-名称]-servlet.xml的文件, 并在那里定义相关的Beans,重写在全局中定义的任何Beans。

2、配置静态资源文件不拦截

如果只配置拦截类似于*.do格式的url,则对静态资源的访问是没有问题的,但是如果配置拦截了所有的请求(如我们上面配置的“/”),就会造成js文件、css文件、图片文件等静态资源无法访问。一般实现拦截器主要是为了权限管理,主要是拦截一些url请求,所以不对静态资源进行拦截。要过滤掉静态资源一般有两种方式。

第一种是采用<mvc:default-servlet-handler />,(一般Web应用服务器默认的Servlet名称是”default”,所以这里我们激活Tomcat的defaultServlet来处理静态文件,在web.xml里配置如下代码即可:)

<servlet-mapping>  
    <servlet-name>default</servlet-name>  
    <url-pattern>/js/*</url-pattern>  
    <url-pattern>/css/*</url-pattern>  
    <url-pattern>/images/*</url-pattern>  
    <url-pattern>/fonts/*</url-pattern>  
</servlet-mapping>  

Tomcat, Jetty, JBoss, and GlassFish 默认 Servlet的名字 – “default”
Resin 默认 Servlet的名字 – “resin-file”
WebLogic 默认 Servlet的名字 – “FileServlet”
WebSphere 默认 Servlet的名字 – “SimpleFileServlet”

第二种是采用,在springmvc的配置文件中加入以下代码:

<mvc:resources mapping="/js/**" location="/static_resources/javascript/"/>    
<mvc:resources mapping="/styles/**" location="/static_resources/css/"/>    
<mvc:resources mapping="/images/**" location="/static_resources/images/"/>  

自定义拦截器

在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法。

1、拦截器接口HandlerInterceptor

package org.springframework.web.servlet;  
public interface HandlerInterceptor {  
    boolean preHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler)   
            throws Exception;  

    void postHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, ModelAndView modelAndView)   
            throws Exception;  

    void afterCompletion(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, Exception ex)  
            throws Exception;  
}  
  • preHandle

预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如具体的Controller实现);
返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;

  • postHandle

后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

  • afterCompletion

整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。


局部拦截器

针对单个处理器映射器,就叫局部拦截器。

全局拦截器

springmvc.xml

<!-- 配置springmvc全局拦截器 -->
<mvc:interceptors>
    <!-- 多个拦截器,按顺序执行 -->
    <mvc:interceptor>
        <mvc:mapping path="/**"/><!-- 表示拦截所有的url包括子url路径 -->
        <bean class="com.zyj.inteceptor.Inteceptor1"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.zyj.inteceptor.Inteceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>

Inteceptor1.java

public class Inteceptor1 implements HandlerInterceptor {

    // 在执行处理器映射器之前执行
    //return false:拦截
    //return true:放行
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("Inteceptor1--->preHandle");
        return true;
    }
    // 在还没有调用Controller,还没返回modelAndView之前执行
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("Inteceptor1--->postHandle");
    }
    // 在返回ModelAndView之后执行
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("Inteceptor1--->afterCompletion");
    }
}

Inteceptor2.java

public class Inteceptor2 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("Inteceptor2--->preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("Inteceptor2--->postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("Inteceptor2--->afterCompletion");
    }
}

1.两个拦截器都放行

Inteceptor1--->preHandle
Inteceptor2--->preHandle

Inteceptor2--->postHandle
Inteceptor1--->postHandle

Inteceptor2--->afterCompletion
Inteceptor1--->afterCompletion

2.第一个放行,第二个拦截

Inteceptor1--->preHandle
Inteceptor2--->preHandle

Inteceptor1--->afterCompletion

这里大家可能会好奇,Inteceptor1放行,Inteceptor2拦截,那应该执行完Inteceptor2的preHandle方法后就结束了,怎么会出现Inteceptor1--->afterCompletion

Springmvc规定:凡是preHandle返回true,afterCompletion必须执行。

拦截器的使用

从第二种情况来看,比如现在要写一个统一异常处理的逻辑,那么要将该拦截器放在拦截器链的第一个位置,且一定要放行,因为只有放行了,才会去执行afterCompletion,而且放在拦截器链的第一个的话,afterCompletion方法会最后执行,才能在里面执行统一异常处理的逻辑。 再比如,登陆认证拦截器,放在拦截器链接中第一个位置(如果有统一异常处理,那么应该放在统一异常处理的后面)。权限校验拦截器,放在登陆认证拦截器之后(因为登陆通过后才校验权限)。

上一篇:《SpringMVC(四)之requestParam、requestBody、responseBody》
下一篇:《SpringMVC+Jersey实现跨服务器上传图片》

COMSOL报错调试总结(不定期更新) COMSOL报错调试总结1. 可定位错误1.1 除零错误1.2 未定义变量值1.3 边界条件/材料属性等缺失2. 难定位错误2.1. 装配期间内存不足 官方给的案例总是非常完美,运行流畅,结果完美。但是自己做模型时候就总是报错,而且不像自己coding的程序那样可以明确定位哪里出了bug。这里把我碰到的一些报错问题以及调试方法记录下来~ 部分来源于以下参考来源: http://wap.sciencenet.cn/blog-1467490-1118453.html?mobile=1 1. 可定位错误 以下错误 阅读详情

相关推荐

自监督学习与上下文赌博机融合:视觉决策中的协同优化与实战指南

在机器学习领域,自监督学习(Self-Supervised Learning)通过设计前置任务从无标注数据中学习通用表征,已成为解决标注数据稀缺问题的关键技术。其核心原理是利用数据自身的结构生成监督信号,训练编码器提取鲁棒特征。上下文赌博机(Contextual Bandits)作为强化学习的简化分支,专注于在给定上下文信息下做出单步最优决策,平衡探索与利用,广泛应用于推荐系统、广告投放等场景。将两者结合,构建端到端的协同训练框架,能让视觉表征的优化直接服务于最终的决策目标,同时利用自监督任务作为正则化项提

weixin_33721344的博客 520

Spring 之 jwt,过滤器,拦截器,aop,监听器,参数校验

OverrideSystem.out.println("过滤器2初始化");System.out.println("过滤器2前执行");System.out.println("过滤器2后执行");System.out.println("过滤器2毁灭");} }/*** 重写addCorsMappings() 解决跨域问题* 配置:允许http请求进行跨域访问* @Author 有梦想的肥宅*/

初心魏的博客 3404

图像质量评估(9) -- 杂散光(Flare)的测量标准与实战解析

本文深入解析了杂散光(Flare)对图像质量的影响及其测量标准,包括ISO 9358和ISO 18844的核心方法。通过实战指南和优化策略,帮助读者掌握杂散光的测量与控制技术,提升光学系统性能。

sql99的博客 250

基于springSecurity整合jwt拦截器部署

springboot整合springsecurity和jwt的拦截器部署

weixin_61919057的博客 1327

射频接收机本振相噪指标计算:从倒易混频到GSM实战

在射频接收机设计中,相位噪声是衡量本振信号频谱纯度、影响系统灵敏度的关键指标。其核心影响机制源于倒易混频原理:当不纯净的本振信号与强带外阻塞信号混频时,本振的噪声边带会被转换到中频通带内,从而抬升接收机噪声基底。这一过程直接决定了接收机在阻塞测试等场景下的性能极限。从技术价值看,精确计算本振相噪要求,是进行系统噪声预算、实现成本与性能权衡的核心依据。尤其在手机、基站等对灵敏度要求极高的应用中,它指导着锁相环和压控振荡器的选型与设计。本文以经典的GSM DCS1800标准为例,通过详细的公式推导与变量分析,演

weixin_30368405的博客 325

YOLOv11 环境配置全流程 | 从零开始搭建训练与推理环境

YOLOv11环境配置与训练全流程指南 本文详细介绍了YOLOv11目标检测模型的环境配置、训练与推理全流程。内容包括: 环境要求:列出GPU、CUDA、Python等组件的版本要求,提供快速检查脚本 Windows配置: CUDA 12.6和cuDNN 8.9.7安装步骤 使用Conda创建隔离环境 PyTorch GPU版本安装方法 IDE环境配置 Linux配置:提供Ubuntu 22.04下的CUDA、cuDNN安装命令和Conda环境搭建 Docker方案:提供一键式容器化部署命令 训练实战: 数

shrgegrb的博客 2015

SpringMVC(1)--理论前言

一.核心类与接口DispatcherServlet   -- 前置控制器HandlerMapping接口 -- 处理请求的映射HandlerMapping接口的实现类:SimpleUrlHandlerMapping  通过配置文件,把一个URL映射到ControllerDefaultAnnotationHandlerMapping  通过注解,把一个URL映射到Controller类上 Handl...

qq_41122556的博客 271

基于YOLOv11的手写数字与符号识别系统设计与实现

手写数字与符号识别系统需要丰富多样的训练数据才能达到理想的泛化性能。MNIST:包含70,000个手写数字样本(0-9),28x28灰度图像优点:干净整齐,适合初学者缺点:多样性不足,只有数字EMNIST:MNIST的扩展,包含数字、字母(大小写)和特殊符号样本量:814,255张图像覆盖62个类别(10数字+26小写字母+26大写字母)HASYv2:专门的手写符号数据集包含369个不同符号类别约168,000个标注实例包括数学符号、箭头、括号等:英文手写文本数据库。

YOLO 290

SpringMVC可以配置多个拦截后缀*.action和.do等

  首先介绍一下.do和.action的区别:     struts早期的1版本,以.do为后缀。    同时spring的MVC也是以.do为后缀。    几年前struts收购鼎鼎大名的webwork2和开发团队后,将webwork简单封装,原计划是叫做strutsTi,    后来怕广大struts1的老用户有歧义,改名叫做struts2,并沿用了webwork2的规则,...

weixin_30267785的博客 1381

STM32芯片解锁读写保护:更改Option Byte [Error已解决]

解锁读保护:STLink更改Option Byte 变Level从1变为0,点击Apply即可。(程序执行读保护,其实是将Level从0变为1) 默认情况下该保护功能是不开启的,若要开启该功能,需要改写内部FLASH选项字节(Option Bytes)中的配置。 RDP读保护级别 级别0,无保护, 级别1,使能读保护, 这种保护下,若使用调试功能(使用下载器、仿真器)或者从内部SRAM自举时都不能对内部FLASH及备份SRAM作任何访问(读写、擦除都被禁止); 当芯片处于级别1的时候,可以把选项字节

HowieXue 薛永浩的博客 2万+

使用亚组分析进行子组分析并可视化森林图 - R语言

通过亚组分析和森林图的结合,我们可以更好地理解不同子组之间的差异和效果大小。当然,在实际应用中,还需要考虑多种因素,如样本量、异质性等,以得到更准确的结果和结论。每个森林图中的水平线代表了每个子组的效应估计,线的长度表示了该效应估计的置信区间。假设我们有一个包含研究对象的数据框(data frame),其中包括了治疗组和对照组的结果数据,以及一些可能的影响因素作为调整变量。在本例中,我们将比较两种不同的治疗方法(A和B)对结果变量的影响,并调整了一个额外的变量。是结果变量和对照组变量的列名。

2301_79326857的博客 1234

SpringMVC5-Interceptor拦截器

注解开发 一、配置文件 二、不用实现接口 处理方法相对配置很灵活,但参数和返回值有规定,不能随便写 三、路径符合规则 3.1 多路径配置 省略的value属性是一个String[],字符串数组 3.2 命名空间 每个方法路径前面加一个统一的前缀(像前面加一个域名一样) 3.3 方法通配 在和my中间,方法路径前面有且只有一层 my/b/third.do 在和my中间,方法路径前面有任意层 3.4 限定请求类型 method是一个String[],字符串数组,现在写get和post就.

战无道的博客 386

Apache Kafka Connect任意文件读取漏洞(CVE-2025-27817)

由于Apache Kafka客户端未对用户输入进行严格验证和限制,未经身份验证的攻击者可通过构造恶意配置读取环境变量或磁盘任意内容,或向非预期位置发送请求,提升REST API的文件系统/环境/URL访问权限。(CVE-2025-27817)

iSee857的博客 2026

SpringMVC(五)【拦截器】

SpringMVC 拦截器

功不唐捐,玉汝于成 1353

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SpringMVC(五)拦截器

Spring MVC拦截器通过灵活的三个方法钩子,为开发者提供了在请求处理流程中插入逻辑的能力,适合实现与业务紧密相关的横切关注点(如鉴权、日志)。合理使用拦截器可以显著提升代码的可维护性和复用性。

小安同学的博客 1252

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SpringMVC(五)SpringMVC的拦截器

1.拦截器的定义 SpringMVC中的拦截器,类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并做相应的处理.例如,通过拦截器可以进行权限验证,记录请求信息的日志,判断用户是否登录等 通常拦截器类可以通过两种方式来定义,一种是通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类HandlerInterceptorAda...

ah_hzy的博客 309

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SpringMVC入门(五)SpringMVC拦截器的使用

前言      本章讲解SpringMVC拦截器的使用 方法 1.概念 首先要明确一点,在我们的web开发中,有过滤器、监听器等简单的工具,接下来要讲解的是基于SpringMVC的拦截器,可以理解为一个精细化的过滤器。 对于过滤器和监听器我们应该不陌生,它们都是配置在web.xml中的,在之前的学习中我们或多或少的也见到过,只不过在我的博客中没有进行专门的讲解,或许我会专门讲解一下这两个...

jwang的博客 298

SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)1. 拦截器概念拦截器( Interceptor )是一种动态拦截方法调用的机制作用. 在指定的方法调用前后执行预先设定后的的代码. 阻止原始方法的执行2. 拦截器与过滤器区别。

HHX_01的博客 1586

SpringMVC教程五【Restful和拦截器】

Restful风格 Restful是一种软件设计规范,是客户端和服务端进行数据交互的一个规范。早期使用jsp页面开发网页,数据交互基本都是通过表单提交,然后通过内置对像传递,当HTML5兴起,移动互联网兴起,网站后端服务,不仅要考虑PC端的网页,也要考虑移动端数据的展示、小程序、HTML5页面等。如果需要多个终端(Android、iOS、小程序、Pad、HTML5页面)共用一个后端,一般来说主流方...

qq_30984561的博客 352

SpringMVC学习(五)——拦截器

springMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。 过滤器是servlet规范中的一部分,任何java web工程都可以使用。 拦截器是springMVC框架才能使用的,只拦截访问的控制器方法,不拦截jsp页面,HTML等,自定义拦截器必须事先HandlerInterceptor接口。 编写拦截器 /** * 自定义拦截器 */ public class MyInterceptor1 implements HandlerIntercept

ZhenHYang的博客 159

springMVC框架--springMVC拦截器原理(五)

一、     SpringMVC拦截器实现原理 用户请求到DispatherServlet中,DispatherServlet调用HandlerMapping查找Handler,HandlerMapping返回一个拦截器链(HandlerExecutionChain),springmvc中的拦截器是通过HandlerMapping发起的。          在企业开发,使用拦截器实现用户认证(

1万+

SpringMVC学习(五)——拦截器示例

部分内容摘自开涛的《跟我学SpringMVC.PDF》 拦截器,本质类似于AOP,主要的应用场景:   1.日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV等。   2.权限检查:如登录检测,进入处理器检测是否登录,没有登录返回登录页面。   3.性能监控:记录拦截器进入处理器和离开处理器的时间。   4.通用行为:读取cookie中的用户信息放入请求,从而方...

desfmgs5372的博客 191

SpringMvc全局异常处理和拦截器(SpringMVC⑤)

1.全局异常处理 注意: 一定要让springmvc扫描到该异常处理类。还有就是这个异常处理类是全局匹配的 2.拦截器 先声明一点的是拦截器和过滤器是不同的 过滤器: 拦截器所有的资源.[jsp,servlet,css,js,img] 拦截器: 只会拦截springmvc的控制层接口路径。 请求----》拦截器1 prehandle方法----》拦截器2的prehandle方法---》拦截器3的prehandle方法----》执行当前请求的controller中的方法----》拦截器3的p.

qq_47456289的博客 604

SpringMVC学习总结(五).拦截器的使用

自定义拦截器     • Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口     – preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理

邢宇超的博客 1877

Marco's Java【SpringMVC入门(五) 之 SpringMVC的拦截器的使用】

前言 我们知道在web开发中,一般有三大板块:Servlet(服务连接器) 、Listener(监听器) 和Filter(过滤器),而今天我们要学习的拦截器可以算是一个精致的过滤器"法宝","法宝"用的好不好,也间接关系到你的Servelt项目是否足够安全,是否足够稳定。 拦截器的概念 在学习Servlet的时候,我们曾使用自定义类实现不同Filter接口的方式,做过拦截的操作,比如说登录拦截,编...

馬克兒的私人博客 228

SpringMVC初写(五)拦截器

在系统开发过程中,拦截器的使用可以使我们实现一些需求。如:登录认证,权限管理等,拦截器的工作核心就是将一些工作流程进行统一处理 拦截器和过滤器的区别: 过滤器过滤的是请求路径,拦截器拦截的各层方法的映射路径;由于过滤器在SpringMVC组件加载之前就开始工作,将会导致SpringMVC的一些功能组件无法使用,而拦截器是SpringMVC的功能之一,可以使用SpringMVC里面的一些组件 ...

weixin_33827731的博客 156
上一篇: Maven之jsp文件出现红叉
下一篇: Lucene6.6.2之代码示例
章 鱼
博客等级 码龄10年 203粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值