转自:http://relucent.iteye.com/blog/708535
关于Extjs异步session超时问题处理
对于HTTP超时的判断,我们可以通过过滤器Filter来判断。
如果页面超时,我们可以使用诸如request.forward() 之类的方法跳转到登陆页面。
但是对于Ajax请求,request.forward()就无能为力了。
并不是因为request.forward()不起作用,而是因为AJAX的原理,所以整个页面是不会做刷新操作。
(PS: request.forward()后的页面文本能够通过XMLHttpRequest.responseText获取)
于是我们需要另一种方法来进行跳转。
其中简单的方法是设置httpStatus的状态,然后ExtJs监听
JAVA
- if( 超时 ){
- if("XMLHttpRequest".equals(request.getHeader("x-requested-with"))){
- response.setStatus(401);
- }
- }
JAVASCRIPT
- Ext.Ajax.on('requestcomplete',function(conn,response,options) {
- if(response.statusText==401){
- Ext.Msg.alert('提示', '会话超时,请重新登录!', function(){
- window.location = 'http://localhost:8080/login.jsp';
- });
- }
- });
jQuery Sessin超时
服务器端:
if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
// response.setStatus(911);//表示session timeout -- ExtJS
//在响应头设置session状态 -- jquery session timeout
response.setHeader("sessionstatus", "sessionOut");
response.getWriter().print("sessionOut");
}
浏览器端:在ajax的complete方法中添加
<pre code_snippet_id="597233" snippet_file_name="blog_20150204_2_3158834" name="code" class="html">complete: function(xhr, type) {
// 通过XMLHttpRequest取得响应头,sessionstatus,
var sessionstatus=xhr.getResponseHeader("sessionstatus");
if(sessionstatus=="sessionOut"){
window.location.replace("./");
alert(sessionstatus);
}
}