开始访问:localhost:8085/aaaaaaaa(这儿是随意的aaaa,因为要想拦截此url),目的是想对没有登录的用户进行拦截,不想让外部来使用网站内部的资源,但是在拦截的时候陷入了死循环,具体分析(注意文章中标红的地方,尤其是/index.html)
注意文章中标红的地方,尤其是/index.html
注意文章中标红的地方,尤其是/index.html
视图映射配置
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("/user/login");
registry.addViewController("/index.html").setViewName("/user/login");
registry.addViewController("/main.html").setViewName("main");
//registry.addViewController("/filemanager").setViewName("index");
WebMvcConfigurer.super.addViewControllers(registry);
}
1. 在springboot设置拦截器的时候,在拦截之前的代码:
@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;
}
}
结果在上边的request.getRequestDispatcher("/index.html").forward(request,response);抛出异常java.lang.StackOverflowError: null,栈溢出,说明此时已经陷入了某个死循环,检查代码发现,在注册拦截器的时候,有如下代码:‘’
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").
excludePathPatterns("index.html","/login","/","/user/login");
}
上边的代码看起来是没有任何错误的,但是只有index.html,/login,/ 和/user/login是不会拦截的,但是index.html是相对路径,没有写成绝对路径,导致会对此/index.html还是会拦截,在上边的request.getRequestDispatcher("/index.html").forward(request,response)中,转发的路径是/index.html,则继续对此路径拦截,循环往复,一直拦截一直拦截,导致栈溢出
出现java.lang.StackOverflowError: null,具体错误如下:
java.lang.StackOverflowError: null
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:564) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:564) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.16.jar:9.0.16]
at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:564) ~[tomcat-embed-core-9.0.16.jar:9.0.16]