Ctrl+F12 查看此类的方法,关系有哪些
必须继承这HandlerInterceptor 这个类
类中有三个方法
public class LoginIntercepter implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 目标方法执行之前 return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 目标方法执行完成以后 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 页面渲染之后 } }
拦截器
1.配置好拦截器要拦截哪些请求
2.把这些配置放在容器中
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 目标方法执行之前 HttpSession session = request.getSession(); //用于获取request信息 Object loginUser = session.getAttribute("login");//这里的login是保存的用户信息,获取当前用户信息 if(loginUser != null) { return true; //放行 } request.setAttribute("msg","请先登陆"); //获取到错误信息,前提是当用户没有登陆或密码错误,此时记录的是错误提示信息 request.getRequestDispatcher("/").forward(request,response); //重定向到默认 return false; }
创建一个config类
所有处理web事务的接口是在WebMvcConfigurer
@Configuration public class AdminConfig implements WebMvcConfigurer { //所有定制web功能的都是WebMvcConfigurer接口 }
其中WebMvcConfigration 中有addInterceptors这个方法
拦截住了默认是一片空白,所以在上面添加了一个拦截信息
@Configuration public class AdminConfig implements WebMvcConfigurer { //所有定制web功能的都是WebMvcConfigurer接口 public void addInterceptors(InterceptorRegistry registry) { //重写这方法 registry.addInterceptor(new LoginIntercepter()) //添加一个拦截器(LoginIntercepter是拦截器类,实现了接口HandlerInterceptor) .addPathPatterns("/**") //(/**)表示默认拦截所有请求 add表示要拦截哪些url请求 .excludePathPatterns("/","/login"); //exclude表示放行的是哪些,此时静态资源也被拦截,css和js生效 } }
因为配了/** 表示拦截所有,所以此时把静态资源也给拦截了
此时进行添加不拦截文件
方法一、 添加放行文件夹,静态资源文件夹里的内容
.excludePathPatterns("/","/login","/css/**","/js/**","/fonts/**")
总结
拦截器:
1.编写一个拦截器,实现HandlerInterceptor接口
2.拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)
3.指定拦截规则,【如果拦截所有那么静态资源也会被拦截】
补充:
日志的使用
import lombok.extern.slf4j.Slf4j;
@Slf4j 在类名前加上注解
// 这里可以添加一个日志,获取请求路径 String requesURI = request.getRequestURI(); log.info("preHandle拦截的请求路径是{}",requesURI);
拦截器的执行过程
preHandle -> postHandle -> afterCompletion