拦截器 -2025/1/21
- 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
- 作用:
- 在指定的方法调用前后执行预先设定的代码
- 阻止原始方法的执行
- 总结:拦截器就是用来做增强
ProjectInterceptor
package com.stdu.controller.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {
@Override
//原始方法调用前执行的内容
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod hm = (HandlerMethod)handler;
String methodName = hm.getMethod().getName();//可以获取方法的名称
System.out.println("preHandle..."+methodName);
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...");
}
}
SpringMvcSupport
package com.stdu.config;
import com.stdu.controller.interceptor.ProjectInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* 配置类,用于配置 Spring MVC 相关设置。
*/
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
// 自定义拦截器,通过 @Autowired 注入
@Autowired
private ProjectInterceptor projectInterceptor;
/**
* 添加静态资源处理器,配置静态资源的映射路径。
*
* @param registry 资源处理器注册表
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 当访问 /pages/** 时,从 /pages/ 目录下查找内容
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
// 当访问 /js/** 时,从 /js/ 目录下查找内容
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
// 当访问 /css/** 时,从 /css/ 目录下查找内容
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
// 当访问 /plugins/** 时,从 /plugins/ 目录下查找内容
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
/**
* 添加拦截器,配置拦截器的路径模式。
*
* @param registry 拦截器注册表
*/
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// 添加自定义拦截器,拦截路径为 /books 和 /books/* 的请求
registry.addInterceptor(projectInterceptor).addPathPatterns("/books", "/books/*");
}
}
1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了