session過時後自動跳轉到登錄頁

項目須要作一個自動登出的功能,查詢了網上的資料,一開始準備用session監聽作,按照下面方式配置監聽器javascript

1.在項目的web.xml文件中添加以下代碼:html

<!--添加Session監聽器-->
<listener>
<listener-class> 監聽器路徑 </listener-class>
</listener>

2.編寫java類。java

public class SessionListener implements HttpSessionListener {
 public void sessionCreated(HttpSessionEvent arg0) {
  // session建立時執行
  SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");
  String nowtimes = simpleFormat.format(new Date());
  User u=null;
  //System.out.println("執行。。 當前時間:"+nowtimes+"_"+u);
  HttpSession ses= arg0.getSession();
  String id=ses.getId()+"_"+ses.getCreationTime();
 }
 public void sessionDestroyed(HttpSessionEvent arg0) {
  // session失效時執行
  SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");
  String nowtimes = simpleFormat.format(new Date()); 
  //System.out.println("session失效了。。 結束時間: "+nowtimes);
 }
}

配置完成後等session失效後成功進入sessionDestroyed方法,準備進行頁面跳轉操做,忽然發現怎麼寫跳轉,愣住了,繼續上網請教大神,發現這個監聽是作一些後臺統計處理的,沒法實現頁面跳轉的功能。jquery

只能放棄這方法了,開始使用過濾器實現web

一、web.xml中添加過濾器配置ajax

<filter>
        <filter-name>sessionFilter</filter-name>
        <filter-class>com.orchestrall.web.helper.session.SessionFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>sessionFilter</filter-name>
        <url-pattern>/actions/*</url-pattern>
</filter-mapping>

二、新建SessionFilter類,實現Filter接口。session

public class SessionFilterimplements Filter {
    public void destroy() {
        // TODO Auto-generated method stub
    }
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        HttpSession session = httpRequest.getSession();
        // 登錄url
        String loginUrl = httpRequest.getContextPath() + "/admin/login.jsp";
        String url = httpRequest.getRequestURI();
        String path = url.substring(url.lastIndexOf("/"));
        // 超時處理,ajax請求超時設置超時狀態,頁面請求超時則返回提示並重定向
        if (path.indexOf(".action") != -1
                && session.getAttribute("LOGIN_SUCCESS") == null) {
            // 判斷是否爲ajax請求
            if (httpRequest.getHeader("x-requested-with") != null
                    && httpRequest.getHeader("x-requested-with")
                            .equalsIgnoreCase("XMLHttpRequest")) {
                httpResponse.addHeader("sessionstatus", "timeOut");
                httpResponse.addHeader("loginPath", loginUrl);
                chain.doFilter(request, response);// 不可少,不然請求會出錯
            } else {
                String str = "<script language='javascript'>alert('會話過時,請從新登陸');"
                        + "window.top.location.href='"
                        + loginUrl
                        + "';</script>";
                response.setContentType("text/html;charset=UTF-8");// 解決中文亂碼
                try {
                    PrintWriter writer = response.getWriter();
                    writer.write(str);
                    writer.flush();
                    writer.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } else {
            chain.doFilter(request, response);
        }
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}

三、客戶端JS,用於ajax請求session超時app

對於jqueryjsp

<script type="text/javascript">
$(document).ajaxComplete(function(event, xhr, settings) {  
    if(xhr.getResponseHeader("sessionstatus")=="timeOut"){  
        if(xhr.getResponseHeader("loginPath")){
            alert("會話過時,請從新登錄!");
            window.location.replace(xhr.getResponseHeader("loginPath"));  
        }else{  
            alert("請求超時請從新登錄 !");  
        }  
    }  
});  
</script>

對於extjs的ajax請求ide

Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this);
    function checkUserSessionStatus(conn,response,options){
        if(response.getResponseHeader("sessionstatus") == 'timeout'){
            if(response.getResponseHeader("loginPath")){
                alert("會話過時,請從新登錄!");
                window.top.location.href = response.getResponseHeader("loginPath");
            }else{
                alert("請求超時請從新登錄 !");
            }
        }
    }

若是使某個ajax請求不受全局方法的影響,那麼能夠在使用$.ajax()方法時,將參數中的global設置爲false,jquery代碼以下:

$.ajax({
    url:"test.html",
    global:false//不觸發全局ajax事件
})
相關文章
相關標籤/搜索