說明:當使用攔截器出現“請求轉發”無限循環或者“重定向”次數過多這種問題的時候,一般都是 攔截器 設置錯了
情況一:請求轉發時沒有配置排除攔截路徑,就是說你訪問的路徑都攔截了,導致一直轉發,從而產生java.lang.StackOverflowError
錯誤
情況二:重定向時沒有配置排除攔截路徑,會導致一直重定向/重定向次數過多
解決辦法:正確添加攔截路徑,正確排除攔截路徑
Spring Boot中我因疏忽導致的錯誤(參考):
錯誤寫法:
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
// addPathPatterns 用於添加攔截規則
// excludePathPatterns 用於排除攔截
//注:因為疏忽下方的index.html前面未加/,轉發多次-->StackOverflowError
.addPathPatterns("/**").excludePathPatterns("index.html","/","/login","/user/login",
"/assets/**","/assets/brand/**","/assets/dist/css/**","/assets/dist/js/**");
}
正確寫法:
自定義的實現了WebMvcConfigurer接口的配置類,並重寫addInterceptors方法
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
// addPathPatterns 用於添加攔截規則
// excludePathPatterns 用於排除攔截
.addPathPatterns("/**").excludePathPatterns("/index.html","/","/login","/user/login",
"/assets/**","/assets/brand/**","/assets/dist/css/**","/assets/dist/js/**");
}
攔截器:
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登陸成功之后,獲取用戶的session
Object loginUser = request.getSession().getAttribute("loginUser");
if (loginUser==null){//未登錄
System.out.println(request.getRequestURI());
request.getRequestDispatcher("index.html").forward(request,response);
// response.sendRedirect("index.html");
return false;
}else {
return true;
}
}
}