重写ajax方法实现异步请求session过期时跳转登录页面

  

一般我们会在过滤器里判断登录状态,如果没登录就跳转登录页面,过滤器java核心代码如下:

  1. UserItem loginUser = (UserItem)request.getSession().getAttribute("loginUser");  
  2. if(loginUser == null) {  
  3.     response.sendRedirect("/login.action");  
  4. }  
UserItem loginUser = (UserItem)request.getSession().getAttribute("loginUser");
if(loginUser == null) {
	response.sendRedirect("/login.action");
}
这个对于普通页面来说完全没问题,但是在使用ajax的时候往往得不到想要的效果。因为页面根本没跳转,只是捕获到了登录页面的源码而已。

网上一堆庸人给出一堆扯蛋的方法,主要有。

1.返回的字符串附加登录状态;(那么多,你愿意改么,而且前后端都得改,编码的时候还要总去考虑那个状态烦不烦)

2.修改http头信息;(装B深沉型)

3.修改jquery源文件判断;(勉强算个程序员,但是尽力不去动源,性能问题你还得解压再压缩,别人也不一定知道你改过源码)

我的解决方案跟第三种方法思路接近,重写ajax方法实现前置处理,代码如下:

[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. jQuery(function($){  
  2.     // 备份jquery的ajax方法    
  3.     var _ajax=$.ajax;  
  4.     // 重写ajax方法,先判断登录在执行success函数   
  5.     $.ajax=function(opt){  
  6.         var _success = opt && opt.success || function(a, b){};  
  7.         var _opt = $.extend(opt, {  
  8.             success:function(data, textStatus){  
  9.                 // 如果后台将请求重定向到了登录页,则data里面存放的就是登录页的源码,这里需要找到data是登录页的证据(标记)  
  10.                 if(data.indexOf('weinianjie') != -1) {  
  11.                     window.location.href= Globals.ctx + "/login.action";  
  12.                     return;  
  13.                 }  
  14.                 _success(data, textStatus);    
  15.             }    
  16.         });  
  17.         _ajax(_opt);  
  18.     };  
  19. });  
jQuery(function($){
    // 备份jquery的ajax方法  
    var _ajax=$.ajax;
    // 重写ajax方法,先判断登录在执行success函数 
    $.ajax=function(opt){
    	var _success = opt && opt.success || function(a, b){};
        var _opt = $.extend(opt, {
        	success:function(data, textStatus){
        		// 如果后台将请求重定向到了登录页,则data里面存放的就是登录页的源码,这里需要找到data是登录页的证据(标记)
        		if(data.indexOf('weinianjie') != -1) {
        			window.location.href= Globals.ctx + "/login.action";
        			return;
        		}
        		_success(data, textStatus);  
            }  
        });
        _ajax(_opt);
    };
});

在登录页面的源码里面,你随便找个地方打个标记然后隐藏掉,比如我的标记就是weinianjie。对于$.get和$.post就不用说了吧,这两个方法都是调用了$.ajax方法的,所以也就自动获取了前置判断能力。

大功告成,注意以上扩展需要放在你的所有ajax请求之前执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值