1、概述
Spring MVC 中的拦截器(Interceptor)基于回调机制,用于在控制器处理请求之前或之后执行某些操作。拦截器可以用来实现诸如权限检查、记录请求信息的日志、修改请求和响应等通用功能。
2、定义
在Spring MVC中,拦截器需要实现HandlerInterceptor接口,该接口提供了三个方法:preHandle()、postHandle()、afterColmpletion()方法。
说明:
- preHandle()方法会在控制器方法执行前被调用,如果返回
true
,则控制器方法将继续执行;如果返回false
,则会中断后续处理流程,不会调用控制器方法,并且不再执行其他拦截器的 postHandle()和 afterCompletion() 方法。 - postHandle()方法会在控制器方法执行后,视图渲染前执行,可以用来修改模型数据或视图名称。
- afterCompletion()方法在整个请求完成后调用,即在视图渲染结束后。这可用于资源清理或记录日志等操作。
3、编写拦截器
例如,我要编写一个限制用户访问时间的拦截器,代码如下:
public class TimeAccessInterceptor implements HandlerInterceptor {
/**
* preHandle在控制层目标方法执行之前执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response,Object handler)
throws Exception {
if(user==null)
LocalTime now=LocalTime.now();//JDK8中的时间对象
int hour=now.getHour();//获取当前时间对应小时
if(hour<=6||hour>=22)
throw new RuntimeException("请在6~10点进行访问");
return true;
}
}
4、配置拦截器
将写好的控制器进行配置,交给Spring管理,并指定要拦截的路径,代码如下:
@Configuration
public class SpringWebConfig implements WebMvcConfigurer{
//配置spring mvc 拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TimeAccessInterceptor())
.addPathPatterns("/api/**");//包含/api开头的路径
}
}
5、启动服务进行访问测试
在static包下建立一个http包,然后在http包下创建.http文件,输入访问请求进行测试。