`

Ajax Session Timeout处理

阅读更多

对于session过期跳转的问题,很简单,就是一个过滤器,然后判断session为空?跳转:继续。但是对于ajax的请求,需要做特殊处理,见下面代码中的

// 此处考虑ajax操作session过期的操作,如果ajax请求过程中session过期,则指定过期状态码为:911.
String requestType = req.getHeader("X-Requested-With");

因为ajax请求的时候请求头是:X-Requested-With,so我们可以根据该请求头做session过期处理。

下面是过滤器的实现,可以作为参考。

package com.***.action.util;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

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;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 标题:SessionFilter.
 * 
 * 描述:session expire filter.
 * 
 * @author lgscofield.
 */
public class SessionFilter implements Filter {

    private final static Log LOGGER = LogFactory.getLog(SessionFilter.class);

    /**
     * 过滤器配置
     */
    private FilterConfig filterConfig;

    /**
     * 超时页面
     */
    protected String sessionTimeOutPage = null;

    /**
     * 某些url前缀列表(如: /css/*, /js/*, /images/***...)
     */
    private List<String> ignoreURIs = new ArrayList<String>();

    /**
     * 静态资源列表(如: *.css, *.js, *.jpg...)
     */
    private List<String> ignoreExts = new ArrayList<String>();

    /**
     * 个别动态资源(如: login.action, navigate.action, login.jsp...)
     */
    private List<String> ignoreActions = new ArrayList<String>();

    /**
     * Default Construct.
     */
    public SessionFilter() {
        super();
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        LOGGER.info("Init LogFilter Start.");
        this.filterConfig = filterConfig;
        // this.context = this.filterConfig.getServletContext();
        // startMonitor();

        // 某些URL前缀不予处理(例如 /img/***)
        String ignores = filterConfig.getInitParameter("ignore");
        if (ignores != null) {
            for (String ig : StringUtils.split(ignores, ',')) {
                ignoreURIs.add(ig.trim());
            }
        }

        // 某些URL扩展名不予处理(例如 *.jpg)
        ignores = filterConfig.getInitParameter("ignoreExts");
        if (ignores != null) {
            for (String ig : StringUtils.split(ignores, ',')) {
                ignoreExts.add('.' + ig.trim());
            }
        }

        // 某写页面及Action不予处理(例如login.jsp,login.action)
        ignores = filterConfig.getInitParameter("ignoreActions");
        if (ignores != null) {
            for (String ig : StringUtils.split(ignores, ',')) {
                ignoreActions.add(ig.trim());
            }
        }

        LOGGER.info("Init LogFilter End.");
    }

    @Override
    public void destroy() {
        this.filterConfig = null;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
            ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        // HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);

        resp.setCharacterEncoding("UTF-8");
        HttpSession session = req.getSession(true);
        String requestUrl = req.getRequestURI();
        String redirectPath = req.getContextPath() + "/navigate.action";

        try {

            //过滤URL前缀
            /*
             * for (String ignoreURI : ignoreURIs) { if (requestUrl.startsWith(ignoreURI)) { chain.doFilter(req, resp);
             * return; } }
             */

            //过滤URL后缀
            for (String ignoreExt : ignoreExts) {
                if (requestUrl.endsWith(ignoreExt)) {
                    chain.doFilter(req, resp);
                    return;
                }
            }

            // 过滤登陆action/jsp
            for (String ingonAction : ignoreActions) {
                if (isContains(requestUrl, ingonAction)) {
                    chain.doFilter(req, resp);
                    return;
                }
            }

            if (requestUrl.endsWith("/portal/") || requestUrl.endsWith("/portal")) {
                resp.sendRedirect(redirectPath);
                return;
            }
        } catch (SecurityException e) {
            String loginPage = req.getContextPath() + URLEncoder.encode(requestUrl, "utf-8");
            resp.sendRedirect(loginPage);
        }

        // 验证session是否过期
        Object user = session.getAttribute("userInfo");
        if (user == null) {
            
            // 此处考虑ajax操作session过期的操作,如果ajax请求过程中session过期,则指定过期状态码为:911.
            String requestType = req.getHeader("X-Requested-With");
            if (!StringUtils.isEmpty(requestType) && requestType.equalsIgnoreCase("XMLHttpRequest")) {
                resp.setStatus(911);
                resp.setHeader("sessionstatus", "timeout");
                resp.addHeader("loginPath", redirectPath);
                return;
            } else {
                // wrapper.sendRedirect(redirectPath);
                resp.sendRedirect(redirectPath);
                return;
            }
        } else {
            chain.doFilter(request, response);
            return;
        }
    }

    public static boolean isContains(String container, String regx) {
        boolean result = false;

        if (container.indexOf(regx) != -1) {
            return true;
        }
        return result;
    }

}

 最后就是页面上的处理了,此处应用了jquery全局事件处理机制:

$(function(){
    $.ajaxSetup({
        contentType: "application/x-www-form-urlencoded;charset=utf-8",
        cache: false,
        complete: function(XHR, TS){
            var resText = XHR.responseText;
            var sessionstatus = XHR.getResponseHeader("sessionstatus");
            var loginPath = XHR.getResponseHeader("loginPath");
            if (911 == XHR.status && "timeout" == sessionstatus) {
                // 此处使用了开源的消息确认框 
                $.messager.confirm('session过期', '您的会话已经过期,请重新登陆后继续操作!', function(confirm){
                    if (confirm) {
                        window.location.replace(loginPath);
                    }
                });
                // 也可以使用下面的原生js的确认框,如果确认则跳转
                if(window.confirm('session过期', '您的会话已经过期,请重新登陆后继续操作!')) {
                    window.location.replace(loginPath);
                }
                return;
            }
        }
    });
});

 

0
0
分享到:
评论

相关推荐

    Ajax请求session超时处理流程

    request.setAttribute("message", "Session timeout!"); response.sendRedirect(response.encodeRedirectURL("/ajaxDone.jsp"); else { response.sendRedirect(response.encodeRedirectURL(this.loginUrl + ...

    session timeout/logout using php and AJAX :

    session timeout/logout using php and AJAX :

    session ajax超时问题处理方案

    NULL 博文链接:https://ait.iteye.com/blog/1867548

    session-timeout-prompter:在会话即将超时时提示用户,并允许他们扩展会话

    会话超时提示Rails 5 Engine在会话即将超时时...session_timeout_prompter需要css: *= require session_timeout_prompter注意:当前依赖jQuery进行ajax /事件处理。用法在布局或任何要显示超时提示的页面上的body标签

    ASP中用ajax方式获得session的实现代码

    很囧 登录代码如下: 代码如下: //从服务器查询是否存在session j.ajax({ type:”GET”, url:”sessioncheck.asp”, data:””, timeout: 1000, error: function(){ alert&#40;‘sorry, server is busy now!’&#41;;...

    如何解决Ajax访问不断变化的session的值不一致以及HTTP协议中的GET、POST的区别

    今天在做一个进度条的时候遇到一个问题,我在session里面存放了一个计数器,当爬取到一条数据的时候这个值+1,然后前台每隔3s中获取一次session的这个值,但是问题出来了,在FF下面,得到的值都是正常的,但是在IE...

    新版JSP+JQUERY+AJAX+Mysql聊天室小程序JASChatWeb1.0

    (2)打开tomcat/conf/web.xml文件 ,找到 &lt;session-timeout&gt;30&lt;/session-timeout&gt; 一行, 把30改成 1-5的数(作用设置是session超时时间,用于扑捉用户直接关闭浏览器时的下 线状态) 完成以上两步后打开tomcat即可在...

    最新的MetroNic_1.5.4 bootstrap3.0.2模版

    New: User Session Timeout Plugin Integration New: User Idle Timeout Plugin Integration New: Sidebar Toggler Button On Header New: Ajax Datatable Integration New: jQuery Flot Bar Chart Samples New: ...

    Metronic v1.5.4

    New: User Session Timeout Plugin Integration New: User Idle Timeout Plugin Integration New: Sidebar Toggler Button On Header New: Ajax Datatable Integration New: jQuery Flot Bar Chart Samples New: ...

    spring web flow demo

    Spring Web Flow 2.0 入门 本教程分析了 Spring Web Flow ...&lt;session-timeout&gt;100&lt;/session-timeout&gt; &lt;/session-config&gt; 然而,现实中的 session 范围更像是“鸡肋”,把大量数据放入 session 会导致严重的效率问题,

    Nginx安装包

    这里我们所需等待时间 = proxy_connect_timeout + fail_timeout*max_fails,所以我如下配置只需等待3秒,nginx便会将请求转给tomcat2,还是在能接受范围内的。 4.小结 该说的在前文也说了,总而言之,spring...

    DWR.xml配置文件说明书(含源码)

    “scope参数允许你配置creator的生命周期,共有以下几个选项:application,session,request,page.这些参数对于用过jsp或servlet的开发人员并不陌生. 3.1 Uing static methods 如果你想远程调用一个creator的静态方法,...

    ZendFramework中文文档

    在PHP Session 中的缺省持久(Persistence) 3.1.3.2. 实现订制存储 3.1.4. 使用Zend_Auth 3.2. 数据库表认证 3.2.1. 简介 3.2.2. 高级使用:持久一个 DbTable 结果对象 3.2.3. 高级用法示例 3.3. 摘要式...

    unigui0.83.5.820

    - 0000445: Customizable Timeout and Terminate pages. - 0000558: Customizable End of Session - 0000748: Field property for DB aware controls - 0000747: AV when trying to access the property ...

Global site tag (gtag.js) - Google Analytics