当前位置: 首页 > news >正文

SpringMVC拦截器应用实例与优化

前言

本文将介绍如何使用SpringMVC的拦截器的基本使用

拦截器概念

SpringMVC拦截器(Interceptor)是一种动态拦截方法调用的机制,它能够在指定的方法调用前后执行预先设定的代码,甚至阻止原始方法的执行。拦截器在Spring MVC框架中主要用于拦截用户请求并做出相应处理,其应用场景包括权限验证、记录请求信息的日志、判断用户是否登录等。

 拦截器核心原理

拦截器的核心原理基于AOP(面向切面编程)思想,通过拦截器链的方式,多个拦截器可以按照一定的顺序对原始被调用功能进行增强。

 拦截器方法

  1. preHandle():在实际handler运行之前执行。此方法返回一个boolean值,用于表示是否中断或继续执行链的处理。当此方法返回true时,handler执行链继续进行;当返回false时,DispatcherServlet认为拦截器本身已经处理了请求(例如,渲染了一个适当的视图),并且不继续执行其他拦截器和执行链中的实际handler。
  2. postHandle():在handler运行后执行,但在视图解析对象之前。此方法可以对ModelAndView做一些修改动作。但需要注意的是,在@ResponseBody和ResponseEntity方法中,postHandle的用处不大,因为这些方法的响应是在HandlerAdapter中和postHandle之前写入和提交的,这意味着对响应进行任何修改都为时已晚。
  3. afterCompletion():在整个请求完成后执行,包括视图渲染。此方法可以用于做资源清理、日志记录等工作。

拦截器配置

在Spring MVC中,可以通过两种方式配置拦截器:

  1. XML配置:在springmvc.xml配置文件中,通过mvc:interceptors标签来配置拦截器。可以配置多个拦截器,并指定每个拦截器的拦截路径和排除路径。
  2. Java配置:通过实现WebMvcConfigurer接口,并重写addInterceptors方法来配置拦截器。这种方式通常用于基于Java的配置方式,如Spring Boot项目。

拦截器案例实现

基于XML配置的拦截器的实现案例

 准备工作

已经实现好了一个web项目的框架,并且配置了springmvc的相关配置 

 第一步:定义一个Controller控制器类

控制器的目的是接收前端请求,并响应结果,这里主要是用来演示拦截器的使用

HelloController 

@RequestMapping("/h")
@Controller  //与Component作用完全一致,只不过有特殊含义
public class HelloController {@RequestMapping("/hi")public ModelAndView hello(){System.out.println("helloController");ModelAndView mv=new ModelAndView();mv.setViewName("hello");mv.addObject("msg","helloooo");return mv;}}

第二步:创建一个类继承HandlerInterceptorAdapter类

一个类继承HandlerInterceptorAdapter类,该类就是一个拦截器类

 MyInterceptor

public class MyInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("前置方法");return super.preHandle(request, response, handler);}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("后置方法");super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("最终方法");super.afterCompletion(request, response, handler, ex);}
}

前置方法在控制器方法执行前执行

后置方法在控制器方法执行之后执行

最终方法无论是否异常一定执行

 第三步:在springmvc的配置文件中配置拦截器

springmvc.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:p="http://www.springframework.org/schema/p"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-4.1.xsd      http://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context-4.1.xsd      http://www.springframework.org/schema/mvc   http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd      http://www.springframework.org/schema/util   http://www.springframework.org/schema/util/spring-util-4.1.xsd"><context:component-scan base-package="com.csx"/><mvc:annotation-driven/><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp"/><!--   拦截器 --><mvc:interceptors><mvc:interceptor><mvc:mapping path="/h/*.do"/><bean class="com.csx.controller.MyInterceptor"/></mvc:interceptor></mvc:interceptors>
</beans>   

主要关注拦截器的配置:

  • <mvc:mapping path="/h/*.do"/>
    • 配置拦截路径
  • <bean class="com.csx.controller.MyInterceptor"/>
    • 配置具体拦截器

测试

启动Spring MVC应用,并访问/h/hi.do路径,观察控制台输出,应该能够看到拦截器的三个方法(preHandle、postHandle、afterCompletion)依次被执行的日志信息。  

此时没写对应页面,所以报404错误,主要观察后端控制台信息: 

拦截器生效 

总结

SpingMVC的拦截器主要做两件事

1.创建拦截器

2.配置拦截器 


http://www.mrgr.cn/news/49724.html

相关文章:

  • LeetCode题练习与总结:累加数--306
  • 【Java】I/O 操作详解
  • JavaSE——集合7:Map(接口实现类特点(重要)、常用方法、遍历方式)
  • MarsCode--字符串有多少种可能性【简单】
  • ICM20948 DMP代码详解(79)
  • 基于Segment Anything 模型的智能抠图开发的产品原型,基于官网案例升级改造
  • 基于Matlab使用蚁群算法寻找最优路径
  • java servlet tomcat springboot 版本对照表
  • Cisco ACI常见问题FAQ科普
  • MySQL 中的外键检查设置:SET FOREIGN_KEY_CHECKS = 1
  • Microsoft PowerPoint 功能快捷键大全
  • 免费送源码:Java+Springboot+MySQL 水环境检测系统的设计与实现 计算机毕业设计原创定制
  • 【Linux进程间通信】Linux信号机制深度解析:保存与处理技巧
  • 高级java每日一道面试题-2024年10月14日-消息中间件篇-如何确保消息中间件的消息不丢失?
  • Mysql高级篇(下)——数据库设计范式
  • java ---- 关于接口的常见面试题
  • SpringBoot项目错误日志打印不容易注意到的坑
  • SAP学习笔记 - 豆知识12 - 自动批量更新会计期间
  • 音乐创作助力!免费音乐素材网站精选
  • 通过API进行Milvus实例配置