解決ajax請求過濾器重定向不跳轉 (過濾器)

最近寫的一個servlet過濾器,用於攔截請求,判斷用戶是否登陸。css

寫好後發現一個問題,當我直接在瀏覽器地址欄裏輸入地址,能夠跳轉頁面;當點擊按鈕時,過濾器代碼正常執行,可是頁面沒有跳轉;是由於按鈕都是ajax請求,默認ajax是不支持重定向的,由於ajax自己就是局部刷新,不會從新加載頁面的。因此須要在過濾器裏再加個ajax請求判斷,而後找個前臺公共js加一個方法。上代碼
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws ServletException, IOException {  
    HttpServletRequest request = (HttpServletRequest)servletRequest;  
    HttpServletResponse response = (HttpServletResponse)servletResponse;  
    String currentURL = request.getRequestURI();  
    String ctxPath = request.getContextPath();  
    //除掉項目名稱時訪問頁面當前路徑  
    String targetURL = currentURL.substring(ctxPath.length());  
    HttpSession session = request.getSession(false);  
       String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ ctxPath;    
       String type = request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");// XMLHttpRequest   
         
    if (currentURL.endsWith(".js") || currentURL.endsWith(".css") || currentURL.endsWith(".png") || currentURL.endsWith(".jpg")) {  
        //這裏表示若是是靜態文件,則進行正常的頁面跳轉  
        filterChain.doFilter(request, response);  
        return;  
    } else {  
    String url = targetURL.substring(targetURL.lastIndexOf('/'));  
    //對當前頁面進行判斷,若是當前頁面不爲登陸頁面  
    if(!(signin_page.equals(targetURL) || signin.equals(url))){  
        System.out.println("1---"+targetURL+"---ctxPath:"+ctxPath+"---currentURL:"+currentURL);  
        //在不爲登錄頁面時,再進行判斷,若是不是登錄頁面也沒有session則跳轉到登陸頁面  
        if(session == null || session.getAttribute("user") == null){  
             if (StringUtils.equals("XMLHttpRequest", type)) {  
                    // 處理ajax請求  
                    response.setHeader("REDIRECT", "REDIRECT");//告訴ajax這是重定向  
                    response.setHeader("CONTEXTPATH", basePath+"/signin.html");//重定向地址  
                    response.setStatus(HttpServletResponse.SC_FORBIDDEN);  
                    return;  
                }else{  
                    response.sendRedirect(ctxPath+signin_page);  
                    return;  
                }  
        }else{  
            //這裏表示正確,會去尋找下一個鏈,若是不存在,則進行正常的頁面跳轉  
            filterChain.doFilter(request, response);  
            return;  
        }  
    }else{  
        //這裏表示若是當前頁面是登錄頁面,跳轉到登錄頁面  
        filterChain.doFilter(request, response);  
        return;  
        }  
    }  
}  html

上面是java過濾器代碼,添加了對於ajax請求的判斷。

$.ajaxSetup( {    
        //設置ajax請求結束後的執行動做    
        complete : function(XMLHttpRequest, textStatus) {  
            // 經過XMLHttpRequest取得響應頭,REDIRECT    
            var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT說明後端想重定向  
            if (redirect == "REDIRECT") {  
                var win = window;    
                while (win != win.top){  
                    win = win.top;  
                }  
              //將後端重定向的地址取出來,使用win.location.href去實現重定向的要求  
              win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");    
            }  
        }    
    });  java

相關文章
相關標籤/搜索