JSF頁面跳轉時清除Session

來源:互聯網
上載者:User

用JSF開發時,難以避免地常會有些Session Scope的MBean,對於這些Bean,我們希望它在同一頁面操作時保留,在頁面跳轉時清除,本文介紹一種自動清除Session的方法。

1.首先在頁面中添加一個Session,用來記錄原頁面的URI,代碼如下:

<%

session.setAttribute("pageFrom", request.getRequestURI());

%>

2.添加一個Filter,攔截所有的JSF,進行Session處理,需在web.xml中添加如下代碼:

 <filter>
  <display-name>sessionGuard</display-name>
  <filter-name>sessionGuard</filter-name>
  <filter-class>net.moon.filter.SessionGuardFilter</filter-class>
  <init-param>
   <description>the key of sessions want to keep to next page, others
    will be delete</description>
   <param-name>keepSessionKeys</param-name>
   <param-value>userID;pageId;com.sun.faces.logicalViewMap;com.sun.faces.application.StateManagerImpl.SerialId;javax.faces.request.charset<param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>sessionGuard</filter-name>
  <url-pattern>*.jsf</url-pattern>
 </filter-mapping>

其中,com.sun.faces.logicalViewMap;com.sun.faces.application.StateManagerImpl.SerialId;javax.faces.request.charset為JSF儲存狀態的一些Session,必須保留。

3.編寫SessionGuardFilter類,判斷請求頁面是否為當前頁面,如不是,進行Session處理,代碼如下:

package net.moon.filter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.StringTokenizer;

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.HttpSession;


public class SessionGuardFilter implements Filter {
 private List<String> keepSessionKeys = new ArrayList<String>();

 public void destroy() {
  // TODO Auto-generated method stub

 }

 @SuppressWarnings("unchecked")
 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain filterChain) throws IOException, ServletException {
  // TODO Auto-generated method stub
  HttpServletRequest hRequest = (HttpServletRequest) request;
  HttpSession session = hRequest.getSession();
  
  // delete useless sessions when change page
  if (!(hRequest.getRequestURI().replace(".jsf", ".jsp").equals(session
    .getAttribute("pageFrom")))) {
   Enumeration<String> en = session.getAttributeNames();
   while (en.hasMoreElements()) {
    String key = en.nextElement();
    if (!keepSessionKeys.contains(key)) {
     session.removeAttribute(key);
    }
   }
  }
 }

 public void init(FilterConfig filterConfig) throws ServletException {
  // TODO Auto-generated method stub
  StringTokenizer st = new StringTokenizer(filterConfig
    .getInitParameter("keepSessionKeys"), ";");
  while (st.hasMoreTokens()) {
   keepSessionKeys.add(st.nextToken());
  }
 }
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.