$.ajax 請求 攔截器 重定向 無效 解決辦法


在ajax 異步請求下 攔截器過濾器中使用 重定向 頁面響應無效

我這里用的是springboot框架,用攔截器實現 對請求的攔截 ,session超時直接跳轉到login.html頁面。

后台代碼:

@Override
    public void addInterceptors(InterceptorRegistry registry)
    {
    //加載自定義攔截器(登錄請求和退出請求放行)
        registry.addInterceptor(new DemoIntercept()).addPathPatterns("/**").excludePathPatterns("/loginController","/logout");
    }


/** *自定義攔截器 **/
public class DemoIntercept implements HandlerInterceptor {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
            throws Exception
    {
        logger.info("afterCompletion:{}", request.getRequestURI());
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
            throws Exception
    {
        logger.info("postHandle:{}", request.getRequestURI());
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception
    {
        //獲取session
        HttpSession session = request.getSession();
        Object username = session.getAttribute("username");
        //用戶如果為null 則 重定向到 login頁面 ,否則放行
        if(null == username)
        {
            //重定向到login.html
             redirect(request, response); 
             return false;
        }
        return true;
    }


      //對於請求是ajax請求重定向問題的處理方法
    public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException{
        //獲取當前請求的路徑
        String basePath = request.getScheme() + "://" + request.getServerName() + ":"  + request.getServerPort()+request.getContextPath();
        //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"說明就是ajax請求,需要特殊處理 否則直接重定向就可以了
        if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
            //告訴ajax我是重定向
            response.setHeader("REDIRECT", "REDIRECT");
            //告訴ajax我重定向的路徑
            response.setHeader("CONTENTPATH", basePath+"/login.html");
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        }else{
            response.sendRedirect(basePath + "/login.html");
        }
    }
}

前台代碼

//這里給所有ajax請求添加一個complete函數
$.ajaxSetup({
            complete : function(xhr, status) {
                //攔截器實現超時跳轉到登錄頁面
                // 通過xhr取得響應頭
                var REDIRECT = xhr.getResponseHeader("REDIRECT");
                //如果響應頭中包含 REDIRECT 則說明是攔截器返回的
                if (REDIRECT == "REDIRECT")
                {
                    var win = window;
                    while (win != win.top)
                    {
                        win = win.top;
                    }
                    //重新跳轉到 login.html 
                    win.location.href = xhr.getResponseHeader("CONTEXTPATH");
                }
            }
        });

這里實現的原理也就是,后台在ajax請求頭上打上標記 (REDIRECT ),標記(REDIRECT )這個請求要重定向,而前台接受到響應后 根據標記(REDIRECT )判斷這個響應頭是否需要 重定向 如果需要則 則獲取重定向地址 就可以了


免責聲明!

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



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