静态资源消失问题
问题来源:
做一个登陆的拦截器遇到的坑。
导致此问题在于拦截器的写法:
public class LoginHandlerIntercepter implements HandlerInterceptor {//注意:必须去注册拦截器,在配置类中
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object loginUser = request.getSession().getAttribute("loginUser");
if (loginUser == null){
request.setAttribute("msg","还未登录,没有权限!");
request.getRequestDispatcher("/index.html").forward(request,response);
return false ;
}
return true;
}
注册该拦截器:
public void addInterceptors(InterceptorRegistry registry) {//注意加上/,这里是写的urlPattern,可能会造成无限递归
registry.addInterceptor(new LoginHandlerIntercepter()).addPathPatterns("/**").excludePathPatterns("/","/index.html","/user/login");//拦截任意下的
}
注意:这里拦截是所有资源;/** ,只要排除了几个urlPattern,并没有排除静态资源。虽然听到网上有些说法可以不用排除静态资源,第一次运行这个并没有问题,第二天运行此项目就报错,如下:
并且所有的静态资源响应格式都是text/html:
所以,最终发现问题:是拦截器造成的。没有放行静态资源
解决办法:
1.修改拦截器:添加放行静态资源的代码
public class LoginHandlerIntercepter implements HandlerInterceptor {//注意:必须去注册拦截器,在配置类中
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
if (uri.endsWith("js")||uri.endsWith("css")||uri.endsWith("jpg")||uri.endsWith("svg")){
return true ;
}
Object loginUser = request.getSession().getAttribute("loginUser");
if (loginUser == null){
request.setAttribute("msg","还未登录,没有权限!");
request.getRequestDispatcher("/index.html").forward(request,response);
return false ;
}
return true;
}
此方式可以同样适用于过滤器(过滤器通常也是拦截请求为/*,此时需要在过滤器中放行静态资源)
2.注册拦截器时:排除静态资源的url请求 -------失败
@Override//拦截是拦截controller,不用处理静态资源
public void addInterceptors(InterceptorRegistry registry) {//注意加上/,这里是写的urlPattern,可能会造成无限递归
registry.addInterceptor(new LoginHandlerIntercepter()).addPathPatterns("/**").excludePathPatterns("/","/index.html","/user/login","**.svg","**.css","**.js");//拦截任意下的
}
此方式失败
总结:解决拦截器或者过滤器需要在拦截器中放行静态资源即可。