拦截器编写规则
1、编写一个拦截器实现HandlerInterceptor接口
新建拦截器,需要实现HandlerInterceptor接口,该接口中有3个方法。一般将登录拦截处理放在preHandle方法中。即在执行目标方法之前执行。
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;
/**
* 登录检查:
* 1、配置好拦截器,要拦截哪些请求
* 2、把这些配置放在容器中
*/
@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);
//获取session
HttpSession session = request.getSession();
//从session中获取登录对象
Object loginUser = session.getAttribute("loginUser");
if(loginUser != null){//如果loginUser不为空
//放行
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("postHandle执行{}","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("afterCompletion执行异常{}","ex");
}
}
2、拦截器注册到容器中(实现WebMvcConfiguration的addInterceptors)
新建配置类,经将该拦截器放入容器中
import com.study.admin.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 拦截器编写规则:
* 1、编写一个拦截器实现HandlerInterceptor接口
* 2、拦截器注册到容器中(实现WebMvcConfiguration的addInterceptors)
* 3、指定拦截器规则【如果是拦截所有,静态资源也会拦截】
*/
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry){
//往容器中添加拦截器LoginInterceptor
registry.addInterceptor(new LoginInterceptor())
//添加要拦截的请求。此处意思是拦截所有请求,包括静态资源
.addPathPatterns("/**")
//要放行的请求
.excludePathPatterns("/","/login","/css/**","/fonts/**","images/**","/js/**");
}
}
3、指定拦截器规则【如果是拦截所有,静态资源也会拦截】
注意:HandlerInterceptor接口中三个方法执行顺序
preHandle:目标方法执行之前执行
postHandle:目标方法执行之后拦截
afterCompletion:页面渲染以后执行