• Struts2 在登录拦截器中对ajax请求的处理


    前言:

    由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串。

     

    之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后根据标识“isNotLogin”进行页面的跳转,但是这样也很麻烦,每一个ajax请求之后,都需要写一句if(returnStr=="isNotLogin"){ window.location.href="xxxxxx" }

     

    查了资料,试了一下ajaxSetup方法,可以给所有的ajax请求设置初始化,个人觉得就类似一个ajax拦截器吧,虽然也需要在每一个需要使用的jsp中进行引用,不过已经方便很多了,减少了重复代码

     

    1.struts.xml

     

    之前贴过,就不再贴了

     

    2.Interception的doIntercept方法中的关键代码

    //ajax请求的处理
    if (request.getHeader("X-Requested-With") != null && request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest"))
    {
    	PrintWriter out = response.getWriter(); 
    	out.print("isNotLogin");//返回一个标识给前端
    	out.flush();
    	out.close();
    	return null;
    }
    
    //http请求的处理
    else
    {
    	//直接跳转到登录页面
    	return "login";
    }

     

    3.写一个单独的js文件,使用jQuery.ajaxSetup() 方法设置全局 AJAX 默认选项,捕获刚刚在拦截器里传递的值

     

    $.ajaxSetup({  
        cache: false, //关闭ajax缓存
        contentType:"application/x-www-form-urlencoded;charset=utf-8",   
        //complete:表示完成请求后触发。即在success或error触发后触发。也有success: 和 error: 等参数,根据需要来
        complete:function(XHR,textStatus){ 
        	var resText = XHR.responseText; 
        	/*根据拦截器传递的标识,进行相关操作*/
        	//isNotLogin标识用户当前未登录,需要将页面转到登录页面
            if(resText=='isNotLogin'){  
            	window.location=basePath+"/web/tologin.html";
            }  
            //isCookieLogin标识当前用户可使用cookie信息进行自动登录
            else if(resText=='isCookieLogin'){   
    
            }          
        }   
    }); 

    20150708补充

    由于$.ajaxSetup级别太高,考虑到只是在请求成功后执行此操作,使用ajaxSuccess更符合需要。

    !!!一定要注意ajaxSuccess的执行时机-->

    ajaxSuccess只会在 

    success: function(data) {
    ……
    }

    success后的函数内容全部执行完毕后才会触发。

    因此假如本来某个ajax请求的预期返回结果是一个json字符串,但是,如果该请求被拦截器拦截掉了,

    且拦截器返回了一个"isNotLogin",很明显不是json格式,那么很有可能后面的js就会出错,js出错就会导致程序中断。这种情况目前还没找到一劳永逸的解决办法,能想到的是可以在前台得到返回值之后进行数据格式的判断或者写try-catch,我使用的是第二种,这样子如果js出错了程序还能继续走,走到ajaxSuccess,相应的页面跳转才能成功完成。

     

    公共的js登录拦截器代码如下:

     

    //当页面中所有ajax请求成功时执行下面的代码
    $(document).ajaxSuccess(function (event,xhr,settings){
    	/*
    	event:触发的事件对象
    	xhr:XMLHttpRequest对象
    	settings:可以获取当前ajax请求中的参数,
    	例如setting.url表示请求的url地址,
    	可以以此来过滤指定的ajax请求
    	*/
    	//alert("ajaxSuccess:"+settings.url);
    	var resText = xhr.responseText; 
    	
    	/*根据拦截器传递的标识,进行相关操作 */
    	//isNotLogin标识用户当前未登录,需要将页面转到登录页面
        if(resText=="isNotLogin"){  
        	window.location=basePath+"/web/register_toLogin.html";
        }  
        //isCookieLogin标识当前用户可使用cookie信息进行自动登录
        else if(resText=="isCookieLogin"){   
    
        } 
       
    });
    
     

    顺便贴一下几个全局 Ajax 事件处理器的执行顺序:



     



     

    关于ajax请求的详细说明的链接:

    http://www.cnblogs.com/heyuquan/archive/2013/05/13/js-jquery-ajax.html

     

    4.将上面的js文件在每一个需要判断是否登录的jsp中进行引用,即可

    • 大小: 54.1 KB
    • 大小: 51.8 KB
  • 相关阅读:
    Calling a parent window function from an iframe
    JSON with Java
    Posting array of JSON objects to MVC3 action method via jQuery ajax
    What's the difference between jquery.js and jquery.min.js?
    jquery loop on Json data using $.each
    jquery ui tabs详解(中文)
    DataTables warning requested unknown parameter
    Datatables 1.10.x在命名上与1.9.x
    jQuery 1.x and 2.x , which is better?
    DataTabless Add rows
  • 原文地址:https://www.cnblogs.com/xcxcxcxc/p/5541150.html
Copyright © 2020-2023  润新知