解决ajax请求过滤器重定向不跳转

前端之家收集整理的这篇文章主要介绍了解决ajax请求过滤器重定向不跳转前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文地址:
http://blog.csdn.net/u013997090/article/details/77338508?locationNum=8&fps=1

最近写的一个servlet过滤器,用于拦截请求,判断用户是否登录

写好后发现一个问题,当我直接在浏览器地址栏里输入地址,可以@R_599_404@面;当点击按钮时,过滤器代码正常执行,但是页面没有跳转;是因为按钮都是ajax请求,默认ajax是不支持重定向的,因为ajax本身就是局部刷新,不会重新加载页面的。所以需要在过滤器里再加个ajax请求判断,然后找个前台公共js加一个方法。上代码

@H_403_8@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 @H_403_8@type = request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");// XMLHttpRequest 

        @H_403_8@if (currentURL.endsWith(".js") || currentURL.endsWith(".css") || currentURL.endsWith(".png") || currentURL.endsWith(".jpg")) {
            //这里表示如果是静态文件,则进行正常的页面跳转
            filterChain.doFilter(request,response);
            @H_403_8@return;
        } @H_403_8@else {
        String url = targetURL.substring(targetURL.lastIndexOf('/'));
        //对当前页面进行判断,如果当前页面不为登录页面
        @H_403_8@if(!(signin_page.@H_403_8@equals(targetURL) || signin.@H_403_8@equals(url))){
            System.out.println("1---"+targetURL+"---ctxPath:"+ctxPath+"---currentURL:"+currentURL);
            //在不为登陆页面时,再进行判断,如果不是登陆页面也没有session则跳转登录页面
            @H_403_8@if(session == null || session.getAttribute("user") == null){
                 @H_403_8@if (StringUtils.@H_403_8@equals("XMLHttpRequest",@H_403_8@type)) {
                        // 处理ajax请求
                        response.setHeader("REDIRECT","REDIRECT");//告诉ajax这是重定向
                       response.setHeader("CONTEXTPATH",basePath+"/signin.html");//重定向地址
                        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                        @H_403_8@return;
                    }@H_403_8@else{
                        response.sendRedirect(ctxPath+signin_page);
                        @H_403_8@return;
                    }
            }@H_403_8@else{
                //这里表示正确,会去寻找下一个链,如果不存在,则进行正常的页面跳转
                filterChain.doFilter(request,response);
                @H_403_8@return;
            }
        }@H_403_8@else{
            //这里表示如果当前页面是登陆页面跳转到登陆页面
            filterChain.doFilter(request,response);
            @H_403_8@return;
            }
        }
    }

上面是java过滤器代码添加了对于ajax请求的判断。

$.ajaxSetup( {    
        //设置ajax请求结束后的执行动作 
        complete : @H_403_8@function(XMLHttpRequest,textStatus) {  
            // 通过XMLHttpRequest取得响应头,REDIRECT 
            @H_403_8@var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT说明后端想重定向 
            @H_403_8@if (redirect == "REDIRECT") {  
                @H_403_8@var win = window;    
                @H_403_8@while (win != win.top){  
                    win = win.top;  
                }  
              //将后端重定向的地址取出来,使用win.location.href去实现重定向的要求 
              win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");    
            }  
        }    
    });

上面是js代码,找个公共的js,里面加入ajaxSetup方法,具体看注释。 以上,就是解决ajax请求过滤器重定向跳转的问题。

猜你在找的Ajax相关文章