zoukankan      html  css  js  c++  java
  • 重写ajax方法实现异步请求session过期时跳转登录页面

    一般我们会在过滤器里推断登录状态,假设没登录就跳转登录页面。过滤器java核心代码例如以下:

    UserItem loginUser = (UserItem)request.getSession().getAttribute("loginUser");
    if(loginUser == null) {
    	response.sendRedirect("/login.action");
    }
    这个对于普通页面来说全然没问题,可是在使用ajax的时候往往得不到想要的效果。

    由于页面根本没跳转。仅仅是捕获到了登录页面的源代码而已。

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

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

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

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

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

    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请求之前运行。



  • 相关阅读:
    POJ 1509 Glass Beads【字符串最小表示法】
    Codeforces 665C Simple Strings【暴力,贪心】
    Codeforces 665D Simple Subset【构造】
    HDU 5667 Sequence【矩阵快速幂+费马小定理】
    Codeforces 667D World Tour【最短路+枚举】
    Codeforces 667D World Tour【最短路+枚举】
    HDU 5676 ztr loves lucky numbers【DFS】
    Codeforces 667C Reberland Linguistics【DFS】
    前端学习笔记三
    Datawhale编程——动态规划DP
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5122540.html
Copyright © 2011-2022 走看看