1.原理
1、根据当前请求,找到HandlerExecutionChain【可以处理请求的handler以及handler的所有 拦截器】
2、先来顺序执行 所有拦截器的 preHandle方法
- 1、如果当前拦截器prehandler返回为true。则执行下一个拦截器的preHandle
- 2、如果当前拦截器返回为false。直接 倒序执行所有已经执行了的拦截器的 afterCompletion;
3、如果任何一个拦截器返回false。直接跳出不执行目标方法
4、所有拦截器都返回True。执行目标方法
5、倒序执行所有拦截器的postHandle方法。
6、前面的步骤有任何异常都会直接倒序触发 afterCompletion
7、页面成功渲染完成以后,也会倒序触发 afterCompletion
如图
开始使用
package com.example.Interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
* 登录拦截器
*/
@Slf4j
public class loginInterceptor implements HandlerInterceptor {
/**
* 拦截之前
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
log.info("拦截的路径:"+requestURI);
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if (user != null) {
return true;
}
// 未登录返回登录
request.setAttribute("msg","亲 未登录");
request.getRequestDispatcher("/").forward(request,response);
return false;
}
/**
* 拦截放行之后
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("放行返回的页面:"+modelAndView);
}
/**
* 页面渲染之后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("页面渲染后的异常:"+ex);
}
}
现在拦截器配置好了然后再配置拦截路径就可以了
释放静态资源哦
package com.example.conf;
import com.example.Interceptor.loginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @date 2021/8/3 16:25
* 配置拦截器
*/
@Configuration //配置
public class loginConfiguration implements WebMvcConfigurer {
// 配置拦截器拦截路径
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 创建自定义拦截对象 拦截所有路径
registry.addInterceptor(new loginInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/","/login")
.excludePathPatterns("/css/**","/fonts/**","/images/**","/js/**");
}
}
这样拦截器就配置Ok啦