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 复制代码
相关推荐
Wang's Blog4 小时前
Java 接入Redis: 服务启动停止与后台运行配置
java·服务器·redis
此时不提桶,更待何时5 小时前
01-04-B-垃圾回收面试与生产事故实战
java·jvm·面试
GreenTea5 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
码事漫谈5 小时前
FDE:一个缩写,两种命运
后端
名字还没想好☜6 小时前
Go context.AfterFunc 实战(Go 1.21):context 一取消就自动跑清理,告别手写 goroutine 监听 Done
后端·golang·go
鹿角片ljp7 小时前
KV Cache 解析
java·算法
captain3767 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee
惊讶的猫7 小时前
意图识别置信度和检索重排的分数
java
明月_清风7 小时前
为什么最近开始关注 JEV?几个实战案例告诉你答案
人工智能·后端