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 复制代码
相关推荐
zihao_tom8 小时前
Spring 简介
java·后端·spring
givemeacar8 小时前
spring session、spring security和redis整合的简单使用
redis·spring·bootstrap
Java女侠_9年实战8 小时前
Spring框架“惯性思维”坑——@Transactional失效场景、Bean注入循环依赖
后端
C雨后彩虹8 小时前
Java Lambda & Stream 避坑指南:20个高频错误案例分析与修复
java·stream·lambda·并行流
环流_8 小时前
多线程3(线程安全问题及解决方案)
java·开发语言
杰克尼8 小时前
天机学堂项目总结(day1~day2)
大数据·jvm·spring·elasticsearch·搜索引擎·spring cloud·mybatis
Ares-Wang8 小时前
flask》》多线程并发数据安全问题 threading.local werkzeug.local.Local
后端·python·flask
覆东流9 小时前
第2天:Python变量与数据类型
开发语言·后端·python
FeBaby9 小时前
Java 高并发场景下 Redis 分布式锁(UUID+Lua)最佳实践
java·redis·分布式
落子君9 小时前
设计模式之【 断路器模式】
java