【SSM】SpringMVC学习笔记8:拦截器
这篇学习笔记是Spring系列笔记的第8篇,该笔记是笔者在学习黑马程序员SSM框架教程课程期间的笔记,供自己和他人参考。
Spring学习笔记目录
笔记1:【SSM】Spring基础: IoC配置学习笔记-CSDN博客 对应黑马课程P1~P20的内容。
笔记2: 【SSM】Spring学习笔记2:注解配置bean_ssm黑马笔记-CSDN博客 对应黑马课程P21~P27
笔记3: 【SSM】Spring学习笔记3:Spring整合MyBatis和Junit_spring整合mybaits-CSDN博客 对应黑马课程P28~30
笔记4:【SSM】Spring学习笔记4:Spring的AOP编程-CSDN博客 对应黑马课程P31~39
笔记5:【SSM】Spring学习笔记5:Spring事务-CSDN博客 对应黑马课程P40~42
笔记6: 【SSM】SpringMVC学习笔记6:SpringMVC入门-CSDN博客 对应黑马课程P43~58
笔记7: 【SSM】SpringMVC学习笔记7:前后端数据传输协议和异常处理-CSDN博客 对应黑马课程P59~65
笔记8:此篇 对应黑马课程P71~74
笔记9:【SSM】SpringBoot学习笔记1:SpringBoot快速入门-CSDN博客 对应黑马课程P90~101
1.是什么
SpringMVC提供的技术,用于在controller前后执行一些操作,包括可以在controller前拦截操作使程序不执行controller的功能。
2. 快速入门
2.1 声明拦截器的bean
这个类需要实现HandlerInterceptor接口。
该接口有三个方法可以重写,但不是必需要重写。
其中preHandle方法实在controller执行前执行的方法,如果该方法返回true,会放行访问controller;否则将不会访问controller,起到一个拦截的效果。
@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {@Override//原始方法调用前执行的内容//返回值类型可以拦截控制的执行,true放行,false终止public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String contentType = request.getHeader("Content-Type");HandlerMethod hm = (HandlerMethod)handler;System.out.println("preHandle..."+contentType);return true;}@Override//原始方法调用后执行的内容public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");}@Override//原始方法调用完成后执行的内容public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion...");}
}
2.2 定义配置类
在该配置类中进行拦截器配置,配置在哪些controller上使用哪些拦截器。
需要继承WebMvcConfigurationSupport(笔记6中对静态界面的放行也是通过这个类来配置),实现addInterceptors方法。自己定义好的拦截器需要注入。
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Autowiredprivate ProjectInterceptor projectInterceptor;@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");}@Overrideprotected void addInterceptors(InterceptorRegistry registry) {//配置拦截器// “/books/*”里使用“*”通配符registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");}
}
该配置类需要被SpringMVC的核心配置类(用于初始化SpringMVC容器的类)扫描到(通过@ComponentScan注解)
@Configuration
@ComponentScan({"com.itheima.controller","com.itheima.config"})
@EnableWebMvc
public class SpringMvcConfig {}
2.3 执行流程
3. 拦截器的参数
如下图拦截器的这些参数使可以使用的。
【豆包】
1.
HttpServletRequest request
- 作用:封装客户端的 HTTP 请求信息,如请求参数、请求头、Cookies 等。
- 常用方法:
request.getParameter("name")
:获取请求参数。request.getHeader("User-Agent")
:获取请求头。request.getSession()
:获取用户会话。- 使用场景:在
postHandle
中,可以读取请求信息用于日志记录或权限验证。2.
HttpServletResponse response
- 作用:封装服务器的 HTTP 响应信息,可用于设置响应头、状态码或直接输出内容。
- 常用方法:
response.setStatus(200)
:设置 HTTP 状态码。response.setContentType("application/json")
:设置响应类型。response.getWriter().write("Custom Response")
:直接输出内容。- 使用场景:在
postHandle
中,可以修改响应头(如添加 CORS 信息)或提前终止响应。3.
Object handler(树树:涉及反射机制)
- 作用:当前请求执行的处理器对象。在 Spring MVC 中,通常是一个
HandlerMethod
(即 Controller 中的方法)。- 常用操作:
- 判断处理器类型:
if (handler instanceof HandlerMethod)
- 获取方法信息:
HandlerMethod handlerMethod = (HandlerMethod) handler;
- 获取方法注解:
handlerMethod.getMethod().getAnnotation(MyAnnotation.class)
- 使用场景:根据不同的处理器或方法注解执行不同的逻辑(如仅对特定接口进行拦截)。
4.
ModelAndView modelAndView
- 作用:封装处理器返回的模型数据和视图信息(仅当处理器返回
ModelAndView
时有效)。- 常用操作:
- 修改模型数据:
modelAndView.addObject("key", "value");
- 更改视图:
modelAndView.setViewName("newView");
- 判断是否有视图:
if (modelAndView != null)
- 使用场景:在响应返回前,动态添加额外数据(如全局变量)或修改视图路径。
5.Exception ex
参数的作用
- 作用:封装处理器(Controller 方法)执行过程中抛出的未被捕获的异常。
- 注意事项:
- 仅当请求处理过程中发生异常时,
ex
才不为null
。- 如果请求正常完成(无异常),
ex
为null
。
4. 拦截器链
对同一个controller配置多个拦截器就会形成拦截器链
如下面对访问/books、/books/的控制器添加两个拦截器,将会以以下顺序执行
- projectInterceptor.preHandle
- ->projectInterceptor2.preHandle
- ->projectInterceptor2.postHandle
- ->projectInterceptor.postHandle
- ->projectInterceptor2.afterCompletion
- ->projectInterceptor.afterCompletion
@Configuration
@ComponentScan({"com.itheima.controller"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {@Autowiredprivate ProjectInterceptor projectInterceptor;@Autowiredprivate ProjectInterceptor2 projectInterceptor2;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//配置多拦截器registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");}
}