SpringBoot对静态资源的拦截问题

mac2024-03-20  29

案例 在做登录案例的时候,自定义了一个登录拦截器。

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版本拦截器对于静态资源访问的区别!

Spring Boot 1.x版本:

Spring Boot 1.x版本已经做好了静态资源映射,所以拦截器不会对.css、.js等静态资源进行拦截

Spring Boot 2.x版本:

Spring Boot 2.x版本,如果按上述注册拦截器,那么静态资源也会被拦截!

解决方案

注册拦截器时,排除路径"/static/**"

@Override public void addInterceptors(InterceptorRegistry registry) { //添加拦截器类 registry.addInterceptor(loginHandlerInterceptor) //拦截要求 .addPathPatterns("/**") //对哪些请求放行 .excludePathPatterns("index.html","/","/login","/static/**"); }
最新回复(0)