案例
在做登录案例的时候,自定义了一个登录拦截器。
public class LoginHandlerInterceptor implements HandlerInterceptor {
/** * 目标方法执行之前 * @param request * @param response * @param handler * @return * @throws Exception */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("loginUser");
if(user == null){
//未登录,拦截并返回登录页
request.setAttribute("msg", "没有权限,请先登录");
request.getRequestDispatcher("/index.html").forward(request, response);
return false;
}else {
//已登录,放行
return true;
}
}
@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 {
}
}
//注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html","/","","/user/login");
}
Spring Boot 1.x和2.x版本拦截器对于静态资源访问的区别!
<mark>Spring Boot 1.x版本:</mark>
- Spring Boot 1.x版本已经做好了静态资源映射,所以拦截器不会对.css、.js等静态资源进行拦截
<mark>Spring Boot 2.x版本:</mark>
- Spring Boot 2.x版本,如果按上述注册拦截器,那么静态资源也会被拦截!
解决方案
注册拦截器时,排除路径"/static/**"
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器类
registry.addInterceptor(loginHandlerInterceptor)
//拦截要求
.addPathPatterns("/**")
//对哪些请求放行
.excludePathPatterns("index.html","/","/login","/static/**");
}