shiro 自定義過濾器,攔截過期session的請求,並且以ajax形式返回


自定義過濾器:

public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
        if (isLoginRequest(request, response)) {
            if (isLoginSubmission(request, response)) {
                return executeLogin(request, response);
            } else {
                // 放行 allow them to see the login page ;)
                return true;
            }
        } else {
            HttpServletRequest httpRequest = WebUtils.toHttp(request);
            
            if (ShiroFilterUtils.isAjax(httpRequest)) {
                
                HttpServletResponse httpServletResponse = WebUtils.toHttp(response);  
                httpServletResponse.sendError(ShiroFilterUtils.HTTP_STATUS_SESSION_EXPIRE);
                 
                return false;
    
            } else {  
                saveRequestAndRedirectToLogin(request, response); 
            }  

            return false;
        }
    }
    
    /**
     * 判斷ajax請求
     * @param request
     * @return
     */
    boolean isAjax(HttpServletRequest request){
        return  (request.getHeader("X-Requested-With") != null  && "XMLHttpRequest".equals( request.getHeader("X-Requested-With").toString())   ) ;
    }
    
}

封裝ajax

var Error = function () {
    
    return {
        // 初始化各個函數及對象
        init: function () {

        },
        
        // 顯示或者記錄錯誤
        displayError: function(response, ajaxOptions, thrownError) {
            if (response.status == 404) {// 頁面沒有找到
                pageContent.load($("#hdnContextPath").val() + "/page/404.action");
            } else if (response.status == 401) {// session過期
                SweetAlert.errorSessionExpire();
            } else if (response.status == 507) {// 用戶訪問次數太頻繁 
                SweetAlert.error("您的訪問次數太頻繁, 請過一會再試...");
            } else {//其他錯誤
                window.location = $("#hdnContextPath").val() + "/page/500.action";  
            }
            console.log(thrownError);
        }

    };

}();

jQuery(document).ready(function() {
    Error.init();
});

JS的引用處如下:

App.blockUI();
    
    $.ajax({
        url: $("#hdnContextPath").val() + "/feedback/queryFeedBackDetail.action",
        type: "POST",
        async: false,
        data: {"feedbackId": feedbackId, "userId": userId, "status": status},
        success: function(data) {
            // 忽略
        },
        error: function (response, ajaxOptions, thrownError) {
            App.unblockUI();
            Error.displayError(response, ajaxOptions, thrownError);                
        }
    });

 


免責聲明!

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



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