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 复制代码
相关推荐
折哥的程序人生 · 物流技术专研12 小时前
Java面试85题图解版(一):基础核心篇
java·开发语言·后端·面试
AllData公司负责人12 小时前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql
Moment12 小时前
面试官:如果产品经理给你多个需求,怎么让AI去完成❓❓❓
前端·后端·面试
Hello.Reader13 小时前
算法基础(十)——分治思想把大问题拆成小问题
java·开发语言·算法
一只大袋鼠13 小时前
JavaWeb四种文件上传方式(下篇)
java·开发语言·springmvc·javaweb
每天进步一点_JL13 小时前
JVM 内存模型与 OOM 排查:从入门到实战
后端
TE-茶叶蛋13 小时前
深入研究 yudao-framework 模块:Java 编程能力提升指南
java·开发语言
逻辑驱动的ken13 小时前
Java高频考点场景题24
java·开发语言·面试·职场和发展·求职招聘
兔小盈13 小时前
多线程-(五)线程安全之内存可见性
java·开发语言·多线程
REDcker13 小时前
个人博客网站建设指南 Markdown资产化与静态站选型部署
前端·后端·博客·markdown·网站·资产·建站