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);                
        }
    });
复制代码

 

posted @   风间影月  阅读(12380)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2016-06-23 权限框架 - shiro 授权demo
点击右上角即可分享
微信分享提示