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);
        }
    });

 

时间: 2024-10-07 00:54:47

shiro 自定义过滤器,拦截过期session的请求,并且以ajax形式返回的相关文章

shiro和spring集成时session管理器超时时间问题

问题描述 shiro和spring集成时session管理器超时时间问题 这是我的配置文件,我配置了并发人数控制和动态权限过滤,然后session超时时间这里也是配置了的,然后并没有什么鸟用,在登录以后获取超时时间也是正常的,但还是1分钟就过期了. <?xml version="1.0" encoding="UTF-8"?> xmlns:util="http://www.springframework.org/schema/util"

在自定义HttpHandler中使用Session

session 最近需要做一个对特定请求进行响应的接口,只是在内部处理,不存在UI,机于这种情况,当然是使用实现IHttpHandler来进行处理,可以减掉加载HTML 控件的时间.本来都是这样想的,对于IHttpHandler 中定义了两个方法,ProcessRequest(HttpContext ctx) 和 IsRunable() 这两个,看到在ProcessRequest(HttpContext ctx) 中有个HttpContext的输入参数,本来以为通过这个就可以对所有的服务器对象进

【spring源码学习】springMVC之映射,拦截器解析,请求数据注入解析,DispatcherServlet执行过程

[一]springMVC之url和bean映射原理和源码解析 映射基本过程 (1)springMVC配置映射,需要在xml配置文件中配置<mvc:annotation-driven >  </mvc:annotation-driven> (2)配置后,该配置将会交由org.springframework.web.servlet.config.MvcNamespaceHandler处理,该类会转交给org.springframework.web.servlet.config.Anno

详解AngularJS中自定义过滤器_AngularJS

过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们是:currency(货币).date(日期).filter(子串匹配).json(格式化json对象).limitTo(限制个数).lowercase(小写).uppercase(大写).number(数字).orderBy(排序).总共九种.除此之外还可以自定义过滤器,这个就强大了,可以满足任何

Springnvc框架中的拦截器如何配置可以拦截html页面的请求?

问题描述 Springnvc框架中的拦截器如何配置可以拦截html页面的请求? Springnvc框架中的拦截器如何配置可以拦截html页面的请求? 解决方案 SpringMVC及拦截器基本配置:http://se7en8974.iteye.com/blog/826670 springMVC 拦截器简单配置:http://blog.csdn.net/lqx1988221/article/details/36420887

求教tomcat启动后自动执行自定义的拦截器

问题描述 求教tomcat启动后自动执行自定义的拦截器 可能是我对项目不熟悉,我不知道是怎么配置,或者是怎么实现的,使tomcat启动后自动执行了拦截器中的代码,因为我打印了启动的语句,而且还有一个问题,就是它执行了两遍,希望大神多指点指点!!!!! 解决方案 执行了两遍,这个不好说,,具体看看拦截器怎么写的

mvc5-求救:MVC5 过滤器中的session哪里去了

问题描述 求救:MVC5 过滤器中的session哪里去了 MVC5过虑器的参数类型变成httpActionContext了,但是这个类型找不到session了,怎么办 public class LoginCheckFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { base.OnActionExecuting(act

简述angular自定义过滤器在页面和控制器中的使用_Android

AngularJS另一个特点就是提供了过滤器,可以通过操作UNIX下管道的方式,操作数据结果. 通过使用管道,可以便于双向的数据绑定中视图的展现. 过滤器在处理过程中,将数据变成新的格式,而且可以使用管道这种链式风格,还能接受附加的参数. 首先设置自定义过滤器. 定义模块名:angular .module('myApp') .filter('filterName',function(){ return function(要过滤的对象,参数1,参数2,...){ return Obj; //这里返

Avalon中文长字符截取、关键字符隐藏、自定义过滤器_javascript技巧

关于AvalonJS avalon是一个简单易用迷你的MVVM框架,它最早发布于2012.09.15,为解决同一业务逻辑存在各种视图呈现而开发出来的. 事实上,这问题其实也可以简单地利用一般的前端模板加jQuery 事件委托 搞定,但随着业务的膨胀, 代码就充满了各种选择器与事件回调,难以维护.因此彻底的将业务与逻辑分离,就只能求助于架构. 最初想到的是MVC,尝试过backbone,但代码不降反升,很偶尔的机会,碰上微软的WPF, 优雅的MVVM架构立即吸引住我,我觉得这就是我一直追求的解决之