19.拦截器
配置拦截器需要实现两步
1.配置自己的拦截器,实现HandlerInterceptor接口,重写里面的三个方法,注意方法的执行时机
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
//重点1:目标方法执行前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
if(session.getAttribute("loginUser")==null){
log.info("用户没有登录,转发到登录!");
session.setAttribute("msg", "请先登录!");
request.getRequestDispatcher("/").forward(request, response);
//重点4:false为拦截
return false;
}
//重点5:true为放行
return true;
}
//重点2:目标方法执行完成后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("目标方法执行完毕,返回给页面的值{}",modelAndView);
}
//重点3:页面渲染完成后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("页面渲染完毕,执行异常{}",ex);
}
}
2.在定制化webmvc中添加自己的拦截器
/**
* 1.编写一个拦截器实现HandlerInterceptor接口
* 2.拦截器注册到容器中(在webmvcconfigurer的addInterceptors)
* 3.指定拦截规则【如果是拦截所有,静态资源也会拦截】
*/
//重点1:自定义的springboot配置类
@Configuration
public class MyWebConfig {
//添加自定义的WebMvcConfigurer组件,并重写addInterceptor方法(添加拦截器!)
@Bean
public WebMvcConfigurer getWebMvcConfiguration(){
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())//添加自定义的拦截器
.addPathPatterns("/**")//拦截所有请求,包括了静态资源
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");//排除不拦截的请求,这里包括了登录页面请求和静态资源请求
}
};
}
}
拦截器执行原理: