ajax重定向不生效问题

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

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

[java]  view plain  copy
  1. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws ServletException, IOException {  
  2.     HttpServletRequest request = (HttpServletRequest)servletRequest;  
  3.     HttpServletResponse response = (HttpServletResponse)servletResponse;  
  4.     String currentURL = request.getRequestURI();  
  5.     String ctxPath = request.getContextPath();  
  6.     //除掉项目名称时访问页面当前路径  
  7.     String targetURL = currentURL.substring(ctxPath.length());  
  8.     HttpSession session = request.getSession(false);  
  9.        String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ ctxPath;    
  10.        String type = request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");// XMLHttpRequest   
  11.          
  12.     if (currentURL.endsWith(".js") || currentURL.endsWith(".css") || currentURL.endsWith(".png") || currentURL.endsWith(".jpg")) {  
  13.         //这里表示如果是静态文件,则进行正常的页面跳转  
  14.         filterChain.doFilter(request, response);  
  15.         return;  
  16.     } else {  
  17.     String url = targetURL.substring(targetURL.lastIndexOf('/'));  
  18.     //对当前页面进行判断,如果当前页面不为登录页面  
  19.     if(!(signin_page.equals(targetURL) || signin.equals(url))){  
  20.         System.out.println("1---"+targetURL+"---ctxPath:"+ctxPath+"---currentURL:"+currentURL);  
  21.         //在不为登陆页面时,再进行判断,如果不是登陆页面也没有session则跳转到登录页面  
  22.         if(session == null || session.getAttribute("user") == null){  
  23.              if (StringUtils.equals("XMLHttpRequest", type)) {  
  24.                     // 处理ajax请求  
  25.                     response.setHeader("REDIRECT""REDIRECT");//告诉ajax这是重定向  
[java]  view plain  copy
  1.                     response.setHeader("CONTEXTPATH", basePath+"/signin.html");//重定向地址  
  2.                     response.setStatus(HttpServletResponse.SC_FORBIDDEN);  
  3.                     return;  
  4.                 }else{  
  5.                     response.sendRedirect(ctxPath+signin_page);  
  6.                     return;  
  7.                 }  
  8.         }else{  
  9.             //这里表示正确,会去寻找下一个链,如果不存在,则进行正常的页面跳转  
  10.             filterChain.doFilter(request, response);  
  11.             return;  
  12.         }  
  13.     }else{  
  14.         //这里表示如果当前页面是登陆页面,跳转到登陆页面  
  15.         filterChain.doFilter(request, response);  
  16.         return;  
  17.         }  
  18.     }  
  19. }  

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

[javascript]  view plain  copy
  1. $.ajaxSetup( {    
  2.         //设置ajax请求结束后的执行动作    
  3.         complete : function(XMLHttpRequest, textStatus) {  
  4.             // 通过XMLHttpRequest取得响应头,REDIRECT    
  5.             var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT说明后端想重定向  
  6.             if (redirect == "REDIRECT") {  
  7.                 var win = window;    
  8.                 while (win != win.top){  
  9.                     win = win.top;  
  10.                 }  
  11.               //将后端重定向的地址取出来,使用win.location.href去实现重定向的要求  
  12.               win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");    
  13.             }  
  14.         }    
  15.     });  

上面是js代码,找个公共的js,里面加入 ajaxSetup方法,具体看注释。

以上,就是解决ajax请求过滤器重定向不跳转的问题。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013997090/article/details/77338508
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值