`
wb284551926
  • 浏览: 539148 次
文章分类
社区版块
存档分类
最新评论

处理ajax的session过期的请求(转载)

阅读更多

问题的产生:  

  现如今Ajax在Web项目中应用广泛,几乎可以说无处不在。

  有时会碰到这样个问题:当Ajax请求遇到Session超时,应该怎么办?

  显而易见,传统的页面跳转在此已经不适用,因为Ajax请求是XMLHTTPRequest对象发起的而不是浏览器,在验证失败后的页面跳转无法反应到浏览器中,因为服务器返回(或输出)的信息被JavaScript(XMLHTTPRequest对象)接到了。

  那么应该怎么处理这种情况呢?

问题的解决之法:

  既然服务器返回的消息被XMLHTTPRequest对象接收,而XMLHTTPRequest对象又是在JavaScript的掌控之中,那么我们是否可以利用JavaScript来完成页面跳转呢?

  当然可以,而且很容易实现!但有一点,我们需要判断一下HTTP请求是否为Ajax请求(因为AJAX请求和普通的请求需要分开处理),这又如何判断呢?其实Ajax请求和普通的HTTP请求是不同的,这体现在HTTP请求的头信息中,如下所示:



 

 

上面两张图片是用火狐的Firebug截取的,前者为Ajax请求的请求头信息;后者是普通的HTTP请求头信息。注意第一图片被红框圈起来的部分,这就是Ajax请求与普通请求不同的地方,AJAX请求头中带有X-Requested-With信息,其值为XMLHttpRequest,这正是我们可以利用的地方。

Javascript代码

$.ajaxSetup方法是来设置AJAX请求默认选项的,我们可以认为是全局的选项设置,因此可以将这段代码提到外部JS文件中,在需要的页面引用。

复制代码
/**
 * 设置未来(全局)的AJAX请求默认选项
 * 主要设置了AJAX请求遇到Session过期的情况
 */
$.ajaxSetup({
    type: 'POST',
    complete: function(xhr,status) {
        var sessionStatus = xhr.getResponseHeader('sessionstatus');
        if(sessionStatus == 'timeout') {
            var top = getTopWinow();
            var yes = confirm('由于您长时间没有操作, session已过期, 请重新登录.');
            if (yes) {
                top.location.href = '/skynk/index.html';            
            }
        }
    }
});

/**
 * 在页面中任何嵌套层次的窗口中获取顶层窗口
 * @return 当前页面的顶层窗口对象
 */
function getTopWinow(){
    var p = window;
    while(p != p.parent){
        p = p.parent;
    }
    return p;
}
复制代码

拦截器的部分代码:

复制代码
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * 登录过滤器
 *  拥有Session是否失效和用户是否登录2个条件判断
 *  如果是ajax请求则设置session超时
 * @author Merlin.Ma
 *
 */
public class LoginFilter implements Filter{
  private String redirectUrl = "/login.html";
  private String sessionKey = "userName";
  @Override
  public void destroy() {
  }
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse rep = (HttpServletResponse) response;
    HttpSession session = req.getSession();
    if( session == null || session.getAttribute(sessionKey) == null){
      //如果判断是 AJAX 请求,直接设置为session超时
      if( req.getHeader("x-requested-with") != null && req.getHeader("x-requested-with").equals("XMLHttpRequest") ) {
        rep.setHeader("sessionstatus", "timeout"); 
      } else {
        rep.sendRedirect( req.getContextPath() + redirectUrl);
      }
    }else {
      chain.doFilter(request, response);
    }   
  }
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    String url = filterConfig.getInitParameter("redirectUrl");
    String key = filterConfig.getInitParameter("sessionKey");
    redirectUrl = url == null? redirectUrl:url;
    sessionKey = key == null ? sessionKey : key ;
  }
}
复制代码

由上面代码可以看出,当Session验证失败(即Session超时)后,我们通过HttpServletRequest取得请求头信息X-Requested-With的值,如果不为空且等于XMLHttpRequest,那么就说明此次请求是Ajax请求,我们作出的反应就是向响应中添加一条头信息(自定义)并且使响应对象HttpServletResponse返回服务器错误信息(518状态是自己随便定义的);这些信息都会被JavaScript接收,那么下面的工作就要将由JavaScript代码了。

 

 

原文地址:https://www.cnblogs.com/renxiaoren/p/5411657.html

  • 大小: 33.2 KB
  • 大小: 39.6 KB
分享到:
评论

相关推荐

    ajax session过期问题的几个解决方案

    现在web开发中,ajax应用的比较多。关于此方面的框架也不少。在应用中都会遇到session过期的问题

    jQuery ajax全局函数处理session过期后的ajax跳转问题

    具体思路:拦截器中判断是否为ajax请求 —— 是ajax请求则返回一个消息 ——页面添加一个全局的ajax处理事件,对消息进行判断,如果是报告session过期,则location到登录页面 第一步,拦截器判断是否为ajax请求: ...

    JS Ajax请求会话过期处理问题解决方法分析

    对于页面来说,处理session过期比较简单,一般只需在过滤器里面判断session用户是否存在,不存在则跳转页面到登陆页即可。 对于Ajax请求来说,这个办法则无效,只能获取到登录页的html代码。原因在于Ajax请求是...

    axios 处理 302 状态码的解决方法

    比如说浏览器打开了一个单页面(SPA)应用,过了一段时间token(或者session)过期了,这个时候页面上发起 Ajax请求之后,后端返回302状态码跳转到login页面。 我这是使用的是 Vue + axios ,发现 axios 无法拦截到 ...

    重写 ajax 实现 session 超时跳转到登录页面实例代码

    主要介绍了重写 ajax 实现 session 超时跳转到登录页面实例代码,需要的朋友可以参考下

    React如何解决fetch跨域请求时session失效问题

    前言 fetch在reactjs中等同于 XMLHttpRequest,它提供了许多与XMLHttpRequest相同的功能,但被设计成更具可扩展性和高效性。...请注意,fetch 规范与 jQuery.ajax() 主要有两种方式的不同,牢记: 当

    解决前后端分离 vue+springboot 跨域 session+cookie失效问题

    主要介绍了前后端分离 vue+springboot 跨域 session+cookie失效问题的解决方法,解决过程也很简单 ,需要的朋友可以参考下

    SpringMVC+Hibernate+annotation+Easyui权限管理系统

    SpringMVC+Hibernate+annotation+Easyui权限管理系统,Session过期控制(包括Ajax请求的过期控制),访问权限控制(权限控制到按钮),hibernate数据库用户名与密码加密,其它的不说了,绝对物有所值

    asp.net 用户在线退出更新实现代码

    最主要的问题是关闭浏览器的时候如何更新用户在线列表 网上流传的方法是不停的ajax异步发送请求,当不再请求的时候就可以判断用户已经关闭浏览器 代码如下: var x=0; function myRefresh() { var httpRequest = new ...

    登录超时给出提示跳到登录页面(ajax、导入、导出)

    主要介绍了登录超时给出提示跳到登录页面(ajax、导入、导出)的相关资料,需要的朋友可以参考下

    web_framework:一个使用Python基于socket开发的MVC架构的Web框架

    通过生成摘要,加盐等方法生成可进行过期时间验证的CSRF Token并分发在表单中。 实现服务端对CSRF Token的验证。 通过Jinja2对静态HTML内容的自动转义以应对XSS攻击。 使用原生JavaScript实现对动态内容的

    千方百计笔试题大全

    133、在一个JSP的请求处理中如何停止JSP的执行 33 134、在JSP中如何定义方法 33 135、在JSP中能发送EMAIL吗 34 136、在SERVLET中我能调用一个JSP错误页吗 34 137、APPLET和JSP如何通讯 35 138、JSP如何与EJB ...

    java面试宝典

    133、在一个JSP的请求处理中如何停止JSP的执行 33 134、在JSP中如何定义方法 33 135、在JSP中能发送EMAIL吗 34 136、在SERVLET中我能调用一个JSP错误页吗 34 137、APPLET和JSP如何通讯 35 138、JSP如何与EJB Session...

    HttpClient以及获取页面内容应用

    6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。 7. 插件式的自定义认证方案。 8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。 9. 连接管理器支持多线程应用。支持设置...

    php网络开发完全手册

    17.2.4 PHP中Session处理的定制 282 17.3 Session应用实例——登录验证 286 17.3.1 数据库设计 286 17.3.2 HTML表单的设计 287 17.3.3 验证页面的编写 287 17.3.4 欢迎页面的编写 288 17.3.5 注销页面的编写 288 ...

    ZendFramework中文文档

    删除 AJAX 请求 7.4.3. 子类化请求对象 7.5. 标准路由器:Zend_Controller_Router_Rewrite 7.5.1. 简介 7.5.2. 使用路由器 7.5.3. 基本的Rewrite路由器操作 7.5.4. 缺省路由 7.5.5. 基本 URL 和子目录 ...

    一个适合新手学习的电商项目

    如果用户session已经过期,跳转到登录页面 6. 如果没有过期,放行。 ### 代码: @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ...

    鱼鱼webim2009beta1(2009-5-10)

    程序采用实时等级计算方法,算法类似QQ等级算法,session过期时间为24小时, 如因操作或浏览器进程阻塞等原因退出而不能进入,请等待1天左右。 2008-10-17开始写鱼鱼 2008-10-18上午 基本完成数据库设计,包括了鱼...

Global site tag (gtag.js) - Google Analytics