zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    (SQL)如何将exec执行结果放入外面的变量中--动态sql语句
    Building and Installing ACE on Win32 with MinGW/ MSYS
    TAO和CIAO 简介
    Papervision3D 基础
    ACE网络开发中,各种Reactor实现的总结
    [转]第四期FLASH专家交流会 7月24日 广州东方国际饭店
    ACE介绍及简单服务器实例
    ACE相关资源
    Windows下用Eclipse搭建C/C++开发环境
    ACE的编译和安装,for windows、Linux
  • 原文地址:https://www.cnblogs.com/xcxcxcxc/p/5541150.html
Copyright © 2011-2022 走看看