filter 拦截ajax请求

1.filterpublic class SessonFilter  implements Filter {

    private static Logger log = LoggerFactory.getLogger(SessonFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //empty implement
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        HttpSession session = httpRequest.getSession();
        String uri = httpRequest.getRequestURI();
        String ctxpath = httpRequest.getContextPath();

        String userid = (String)session.getAttribute("userid");

        if(uri.contains("/user/login") || uri.contains("/user/regPage") ){
            chain.doFilter(request, response);
        }else{
            if(userid == null){
                String contextPath = httpRequest.getContextPath();
                String redirect =  contextPath ;
                //ajax session 过期处理
                //1:判断是否是ajax请求
                if (httpRequest.getHeader("x-requested-with") != null
                        && "XMLHttpRequest".equalsIgnoreCase(httpRequest.getHeader("x-requested-with"))) {
                    //向http头添加 状态 sessionstatus
                    httpResponse.setHeader("sessionstatus","timeout");
                    httpResponse.setStatus(403);
                    //向http头添加登录的url
                    httpResponse.addHeader("loginPath", ctxpath);
                    chain.doFilter(request, response);
                    log.debug("ajax request");
                    return ;
                }
                httpResponse.sendRedirect(redirect);
                return;
            }else{
                chain.doFilter(request, response);
            }
        }
    }

    @Override
    public void destroy() {
        //empty implement
    }
}

2.核心代码
//ajax session 过期处理
//1:判断是否是ajax请求
if (httpRequest.getHeader("x-requested-with") != null
                        && "XMLHttpRequest".equalsIgnoreCase(httpRequest.getHeader("x-requested-with"))) {
    //向http头添加 状态 sessionstatus
    httpResponse.setHeader("sessionstatus","timeout");
    httpResponse.setStatus(403);
    //向http头添加登录的url
    httpResponse.addHeader("loginPath", ctxpath);
    chain.doFilter(request, response);
    log.debug("ajax request");
    return ;
}
3.JS
//ajax完成时回调函数
$(document).ajaxComplete(function(event, xhr, settings) {
    //从http头信息取出 在filter定义的sessionstatus,判断是否是 timeout
    if(xhr.getResponseHeader("sessionstatus")=="timeout"){
        //从http头信息取出登录的url = loginPath
        if(xhr.getResponseHeader("loginPath")){
            alert("会话过期,请重新登陆!");
            //打会到登录页面
            window.location.replace(xhr.getResponseHeader("loginPath"));
        }else{
            alert("请求超时请重新登陆 !");
        }
    }
}); 
 
时间: 2024-10-14 01:11:06

filter 拦截ajax请求的相关文章

java Servlet Filter 拦截Ajax请求

在做登录验证的时候,拦截ajax请求,并给出提示,登录超时 java代码 String requestType = request.getHeader("X-Requested-With");//请求类型 判定是否为ajax请求 if("XMLHttpRequest".equalsIgnoreCase(requestType)){//ajax请求 response.setHeader("sessionstatus", "timeout&

mockjax MOCK.js的拦截ajax请求

今天看了下 mock.js的拦截请求 .https://github.com/nuysoft/Mock/blob/master/src/mockjax.js //覆盖(拦截) Ajax 请求,目前内置支持 jQuery.Zepto.KISSY 拦截请求的前提是基于各类库的 内置方法来进行拦截. 比如jquery. 在$.ajax() 之前 会有一个前置过滤器$.ajaxPrefilter() 先进行处理,然后根据参数的不同来分发请求(模拟或者直接发送请求). 在模拟的时候 可以根据给出的参数 返

struts2 拦截ajax请求,无法跳转问题

用struts2自定义拦截器,拦截下ajax请求,在<global-results>配置返回,会将找到的页面当成ajax响应数据返回页面 另,前端是用ext4.2 不知道到有没有影响 解决方法如下: 直接在返回页面中用window.location.href,在ajax返回页面后,自动跳转 参照csdn大神 现仍在寻找,直接ajax请求,直接result返回页面,未果 希望能直接返回

前端开发:mock.js的简单应用(生成随机数据,拦截 Ajax 请求)

摘要 在前端开发过程中,后端接口还没有完全开发完成时,前端开发人员就需要学会自己模拟后端接口数据,更快更好的完成开发任务.模拟后端接口数据的js库有很多,今天就简单就简单的分享下mock.js在前端开发的应用(嘿嘿,毕竟这个mock应用的开发人员较多). 内容 1.Mock的安装 根据官方文档安装mock,运行安装命令安装即可. npm install mockjs 2.Mock的简单介绍 2.1.mock数据模板定义 根据官方文档示例介绍,输出一个随机数的‘*’字符串来展示mock的数据模板,

Filter——拦截请求保护页面安全

由David发表在天码营 在处理创建文章表单的Servlet中,创建了一个Post对象,它的成员变量User被设置为当前Session中的user属性.从业务逻辑的角度来说,那么在创建文章时必须保证当前用户已经登录,对于没有登录的用户,不应该让它看到创建文章的表单页面. 为了实现这样的需求,我们可以直接在Servlet中编写类似逻辑: User user = (User) req.getSession().getAttribute("user"); if (user == null)

Mock.js开发中拦截Ajax

Mock.js 是一款前端开发中拦截Ajax请求再生成随机数据响应的工具.可以用来模拟服务器响应. 优点是非常简单方便, 无侵入性, 基本覆盖常用的接口数据类型. 在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢,答案是肯定的.应该有人通过编写json文件来模拟后台数据,但是很局限,比如增删改查这些接口怎么实现呢,于是今天我们来介绍一款非常强大的插

ajax请求后台,response.sendRedirect失效,无法重定向

今天在写项目的时候,想加一个切换用户,需要清除session并且跳转到登录页面,发起一个ajax请求后,执行完发现无法跳转. 原因在于: (从网上摘录) Ajax只是利用脚本访问对应url获取数据而已,不能做除了获取返回数据以外的其它动作了.所以浏览器端是不会发起重定向的. 1)正常的http url请求,只有浏览器和服务器两个参与者.浏览器端发起一个http请求,服务器端处理后发起一个重定向,浏览器端从response中获取到重定向地址,发起另一个http url请求.也就是说,浏览器会按照r

Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求

Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java 判断请求是不是ajax请求,Java判断是否为ajax请求 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年8月10日 http://www.cnblogs.com/

ajax请求后弹开新页面被浏览器拦截

window.open()我想应该很多人都不陌生吧,它可以实现除用a标签以外来实现打开新窗口! 最近开发项目用到时,却遇到了麻烦,本来好好的弹出窗口,结果被浏览器无情的给拦截了! 代码如下: $.getJSON(URL,data,function(data,state){ if(state=='success'){ window.open('http://www.cnblogs.com/garfieldzhong/'); }else{ alert('请求失败!'); } }) 这要手动允许弹出窗