ExtJS以及JQuery异步请求Session过期解决方案

最近在开发中遇到这样的问题,当Session过期后,通过拦截器判断过期并通过response.sendRedirect(request.getServletContext()+"/login.jsp")重定位到登录界面,但是因为大部分前后台的交互是通过Ajax进行的异步请求,这种做法只能是该请求没有任何的实际相应,但是不能重定位到登录界面。

然后就想能不能对异步请求,在其返回的时候进行统一的前端拦截,判断如果responseText符合{timeout: true, redirectUri:‘/ServletContext/login.jsp‘},也就是说timeout为true则自动重定位到redirectUri对应的页面。

通过网上查找找到如下解决方案:

鉴于一下两个特性:

1、Ext.Ajax是单实例对象(非常重要,全局单一Ext.Ajax实例!)

2、注册Ext.Ajax的requestcomplete事件,每个ajax请求成功后首先响应该事件(概念类似spring的aop拦截)。

首先在公用的脚本文件里增加如下两端内容:

  1.  1 //通过Ext封装的ajax请示时,默认增加请求头
     2 //或者可以使用所有ajax请求都带有的x-request-with:XMLHttpRequest头信息
     3 //如果既有Ext又有Jquery而且要区分处理,则需要这种方式
     4 Ext.Ajax.defaultHeaders = {
     5     ‘Request-By‘: ‘Ext‘    //标识ajax请求
     6 };
     7 //当响应时,自动拦截并判断如果符合timeout为true就重定位到redirectUri
     8 Ext.Ajax.on(‘requestcomplete‘,checkSessionStatus, this);
     9 function checkSessionStatus(conn,response,options){
    10     var json = Ext.decode(response.responseText);
    11     if(typeof json == ‘object‘
    12         && json.timeout){
    13         Ext.Msg.alert("提示","登入超时,系统将自动跳转到登陆页面,请重新登入!",function(){
    14             top.window.location.href = json.redirectUri;
    15         });
    16     }
    17 } 

后台拦截器进行如下修改:

  1.  1 String vsResuqestBy = request.getHeader("Request-By");
     2 String redirectUri = request.getContextPath() + "/login.jsp";
     3 //如果是Ext的ajax请求则返回响应{"timeout":true,"redirectUri":"/ServletContext/login.jsp"}
     4 //否则,则直接重定为到login.jsp
     5 if(vsResuqestBy != null && "Ext".endsWith(vsResuqestBy)){
     6     response.getWriter().write("{\"timeout\":true,\"redirectUri\":\""+redirectUri+"\"}");
     7 }
     8 else{
     9     response.sendRedirect(redirectUri);
    10 }  

OK,到此问题解决,考虑到还有一个项目是jquery的,所以也顺便研究了一下,解决思路如下,只描述出前台的,后台跟上面类似,就不赘述了。

前台Jquery在公共脚本文件中增加:

  1.  1 $.ajaxSetup({
     2     headers: {
     3         ‘Request-By‘: ‘Jquery‘
     4     }
     5 });
     6
     7 $.ajaxComplete(function(event,xhr,settings){
     8     var json = eval(‘(‘+xhr.responseText+‘)‘);
     9     if(typeof json == ‘object‘
    10         && json.timeout){
    11         alert("登入超时,系统将自动跳转到登陆页面,请重新登入!");
    12         top.window.location.href = json.redirectUri;
    13     }
    14 });


本文档参考了lym6520viczhu的思路,感谢。

来自为知笔记(Wiz)

ExtJS以及JQuery异步请求Session过期解决方案

时间: 2024-11-10 15:16:56

ExtJS以及JQuery异步请求Session过期解决方案的相关文章

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

jQuery(function($){ // 备份jquery的ajax方法 var _ajax=$.ajax; // 重写ajax方法, $.ajax=function(opt){ var _success = opt && opt.success || function(a, b){}; var _error = opt && opt.error || function(a, b){}; var _opt = $.extend(opt, { success:functi

jQuery异步请求(如getJSON)跨域解决方案

相信大家在使用jQuery异步请求非自己网站内相对资源(通过别人站点上的URL直接读取)使经常会遇到如下错误吧,实际上这些错误都是浏览器安全机制“搞的鬼”,才让我们开发路上遇到了拦路虎. 当你直接在浏览器中请求:“http://www.weather.com.cn/adat/sk/101110101.html”时会得到你需要的json数据. 当你通过jQuery的getJSON方法读取时你就会得到下列错误. Chrome提示错误: XMLHttpRequest cannot load http:

jQuery异步请求模拟IE登录网站

具体请求的登录验证页面后台逻辑处理,这里我们忽略,不在我们的学习范围内:关键的是使用jQuery异步请求方法,如下例子: 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %> 2 3 <!DOCTYPE html PUBLIC &qu

Android简单封装类似JQuery异步请求

在android开发中经常会使用异步请求数据,通常会使用handler或者AsyncTask去做,handler 配合message 使用起来比较麻烦,AsyncTask 线程池只允许128个线程工作,会有溢出的问题,(当然一般情况不会有那么多线程同时工作的)所以写了这个代码,还望高手指正! [Java]代码 01 package com.xbl.task; 02 03 import java.io.BufferedReader; 04 import java.io.InputStream; 0

Jquery异步请求Action返回JSON

转载请注明出处:jiq?钦's technical Blog 最近在自己写分布式注册中心的Web管理界面,需要点击左边树节点时,请求后台Action查询该节点的详细数据,然后异步刷新右边的节点信息区域. 异步刷新用了Jquery对Ajax的封装: function zTreeOnClick(event, treeId, treeNode) { $.ajax({ type: "POST", url: "Config.action", data: ""

jquery 异步请求Demo【转载】

$(document).ready(function() { $.ajax({ url : "/AjaxAction/LoginArea.ashx", data : {username:user,password:pwd}, type : "POST", //dataType:"json", beforeSend: function(XMLHttpRequest){alert("开始请求")}, //加载过程 success

jquery异步请求返回JSON

第一步:前台的Js Demo: function submitForm(){ var hostname  = $("#hostname").val(); var  port= $("#port").val(); var  validName= $("#validName").val(); var  vp= $("#vp").val(); $.getJSON("req?hostname="+hostname+

session过期时ajax请求刷新浏览器

ajax前置处理实现异步请求session过期时跳转登录页面 function checkLogin(json) { if (typeof(json) === 'string' && ~json.indexOf('<!DOCTYPE html>')) { window.location.href = $('base').attr('href') + 'auth/login' } }

关于jquery同步和异步请求问题总结

关于jquery同步和异步请求问题总结 问题 这几天做项目的时候,写脚本遇到一个问题,就是jquery异步请求和同步请求执行顺序不按代码顺序执行而是最后执行导致添加数据报错,添加到空值,这怎么忍,于是我去查找jquery api,终于知道了原来jquery默认异步请求,防止数据卡死,终于让我找到了这货 async,当async: true 时,ajax请求是异步的.当async : true 时,就是同步的,但是我又有个问题,怎么设置,这个在哪设置,用$.ajax去写这个操作,不,不太麻烦了,到