Spring中的拦截器

文章目录


定义

 拦截器是Spring框架提供的核心功能之⼀, 主要用来拦截用户的请求, 在指定方法前后, 根据业务需要执行预先设定的代码.

 拦截器的使用步骤包括:首先定义拦截器,然后再注册配置拦截器

 定义拦截器的代码如下,需要实现HandlerInterceptor接口,并重写其所有方法,

java 复制代码
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		log.info("LoginInterceptor ⽬标⽅法执⾏前执⾏..");
		return true;//true表示放行,false表示拦截
	}
	
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		log.info("LoginInterceptor ⽬标⽅法执⾏后执⾏");
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		log.info("LoginInterceptor 视图渲染完毕后执⾏,最后执⾏");
	}
}

 注册配置拦截器:实现WebMvcConfigurer接口,并重写addInterceptors方法

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
	//⾃定义的拦截器对象
	@Autowired
	private LoginInterceptor loginInterceptor;
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		//注册⾃定义拦截器对象
		registry.addInterceptor(loginInterceptor).addPathPatterns("/**");
		//设置拦截器拦截的请求路径(此时的/**表⽰拦截所有请求)
	}
}

 一些常见的拦截路径配置如下,

拦截路径 含义 举例
/* ⼀级路径 能匹配/user,/book,/login,不能匹配 /user/login
/** 任意级路径 能匹配/user,/user/login,/user/reg
/book/* /book下的⼀级路径 能匹配/book/addBook,不能匹配/book/addBook/1,/book
/book/** /book下的任意级路径 能匹配/book,/book/addBook,/book/addBook/2,不能匹配/user/login

使用

 http 状态码 401: Unauthorized,中⽂解释为未经过认证,指示身份验证是必需的,没有提供身份验证或身份验证失败,如果请求已经包含授权凭据,那么401状态码表示不接受这些凭据

java 复制代码
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse 
	response, Object handler) throws Exception {
	HttpSession session = request.getSession(false);
	if (session != null && 
	session.getAttribute(Constants.SESSION_USER_KEY) != null) {
	return true;
	}
	response.setStatus(401);
	return false;
	}
}

 需要使用 excludePathPatterns 排除一些路径,比如登录路径,否则访问登录页面时也会进行校验。同时所有的 html 前端排除掉,还有 html 调用的一些 css、js文件等。

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
	//⾃定义的拦截器对象
	@Autowired
	private LoginInterceptor loginInterceptor;
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		//注册⾃定义拦截器对象
		registry.addInterceptor(loginInterceptor).addPathPatterns("/**")
		.excludePathPatterns("/user/login")
		.excludePathPatterns("/**/**.html")
		.excludePathPatterns("/css/**")
		.excludePathPatterns("/js/**")
		.excludePathPatterns("/pic/**");
	}
}

 或者采用传递数组的方式进行,

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
	//⾃定义的拦截器对象
	@Autowired
	private LoginInterceptor loginInterceptor;
	private List<String> excludePaths = Arrays.asList(
		"/user/login",
		"/**/**.html",
		"/css/**",
		"/js/**",
		"/pic/**"
	);
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
	//注册⾃定义拦截器对象
	registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns(excludePaths);
	}
}
c 复制代码
相关推荐
IT_陈寒2 小时前
React的这个渲染问题连官方文档都没说清楚
前端·人工智能·后端
狼爷3 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
葫芦和十三3 小时前
图解 MongoDB 15|journal 与持久化:写入怎么不丢,崩溃怎么恢复
后端·mongodb·面试
葫芦和十三3 小时前
图解 MongoDB 16|压缩:snappy、zstd 和 zlib 的取舍
后端·mongodb·面试
苍何3 小时前
终于找到免费开源TTS模型,克隆声音不要钱,本地电脑也能跑
后端
用户593608741403 小时前
Spring AI 集成 DeepSeek 原生供应商并实现think模式
后端
追逐时光者3 小时前
别再满网找零散工具了,腾讯 QQ 浏览器这个“帮小忙”工具箱真能省时间
前端·后端
心静自然凉8003 小时前
Linux网络核心知识+bonding主备模式配置
后端
爻渡5 小时前
异步编程演进史:从回调到Promise再到Async/Await
后端·程序员
要阿尔卑斯吗7 小时前
企业级 RAG 系统的文件标签管理:三层架构与层级优化实战
后端