Java 使用攔截器無限轉發/重定向無限循環/重定向次數過多報錯(StackOverflowError) 解決方案


說明:當使用攔截器出現“請求轉發”無限循環或者“重定向”次數過多這種問題的時候,一般都是 攔截器 設置錯了

情況一:請求轉發時沒有配置排除攔截路徑,就是說你訪問的路徑都攔截了,導致一直轉發,從而產生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;
        }
    }
}
教訓:寫代碼要細心


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM