1. 程式人生 > >java中Filter的用法

java中Filter的用法

一、使瀏覽器不快取頁面的過濾器

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * 用於的使 Browser 不快取頁面的過濾器
 */
public class ForceNoCacheFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
 {
  ((HttpServletResponse) response).setHeader("Cache-Control","no-cache");
  ((HttpServletResponse) response).setHeader("Pragma","no-cache");
  ((HttpServletResponse) response).setDateHeader ("Expires", -1);
  filterChain.doFilter(request, response);
 }
 public void destroy()
 {
 }
 public void init(FilterConfig filterConfig) throws ServletException
 {
 }
}
二、檢測使用者是否登陸的過濾器
    import javax.servlet.*;   
    import javax.servlet.http.HttpServletRequest;   

    import javax.servlet.http.HttpServletResponse;   

    import javax.servlet.http.HttpSession;   
    import java.util.List;   
    import java.util.ArrayList;   
    import java.util.StringTokenizer;   
    import java.io.IOException;   
      
    /**  
     * 用於檢測使用者是否登陸的過濾器,如果未登入,則重定向到指的登入頁面<p>  
     * 配置引數<p>  
     * checkSessionKey 需檢查的在 Session 中儲存的關鍵字<br/>  
     * redirectURL 如果使用者未登入,則重定向到指定的頁面,URL不包括 ContextPath<br/>  
     * notCheckURLList 不做檢查的URL列表,以分號分開,並且 URL 中不包括 ContextPath<br/>  
     */  
    public class CheckLoginFilter   
     implements Filter   
    {   
        protected FilterConfig filterConfig = null;   
        private String redirectURL = null;   
        private List notCheckURLList = new ArrayList();   
        private String sessionKey = null;   
      
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException   
     {   
      HttpServletRequest request = (HttpServletRequest) servletRequest;   
      HttpServletResponse response = (HttpServletResponse) servletResponse;   
      
       HttpSession session = request.getSession();   
      if(sessionKey == null)   
      {   
       filterChain.doFilter(request, response);   
       return;   
      }   
      if((!checkRequestURIIntNotFilterList(request)) && session.getAttribute(sessionKey) == null)   
      {   
       response.sendRedirect(request.getContextPath() + redirectURL);   
       return;   
      }   
      filterChain.doFilter(servletRequest, servletResponse);   
     }   
      
     public void destroy()   
     {   
      notCheckURLList.clear();   
     }   
      
     private boolean checkRequestURIIntNotFilterList(HttpServletRequest request)   
     {   
      String uri = request.getServletPath() + (request.getPathInfo() == null ? "" : request.getPathInfo());   
      return notCheckURLList.contains(uri);   
     }   
      
     public void init(FilterConfig filterConfig) throws ServletException   
     {   
      this.filterConfig = filterConfig;   
      redirectURL = filterConfig.getInitParameter("redirectURL");   
      sessionKey = filterConfig.getInitParameter("checkSessionKey");   
      
      String notCheckURLListStr = filterConfig.getInitParameter("notCheckURLList");   
      
      if(notCheckURLListStr != null)   
      {   
       StringTokenizer st = new StringTokenizer(notCheckURLListStr, ";");   
       notCheckURLList.clear();   
       while(st.hasMoreTokens())   
       {   
        notCheckURLList.add(st.nextToken());   
       }   
      }   
     }   
    }  

三、字元編碼的過濾器

    import javax.servlet.*;   
    import java.io.IOException;   
      
    /**  
     * 用於設定 HTTP 請求字元編碼的過濾器,通過過濾器引數encoding指明使用何種字元編碼,用於處理Html Form請求引數的中文問題  
     */  
    public class CharacterEncodingFilter   
     implements Filter   
    {   
     protected FilterConfig filterConfig = null;   
     protected String encoding = "";   
      
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException   
     {   
            if(encoding != null)   
             servletRequest.setCharacterEncoding(encoding);   
            filterChain.doFilter(servletRequest, servletResponse);   
     }   
      
     public void destroy()   
     {   
      filterConfig = null;   
      encoding = null;   
     }   
      
     public void init(FilterConfig filterConfig) throws ServletException   
     {   
            this.filterConfig = filterConfig;   
            this.encoding = filterConfig.getInitParameter("encoding");   
      
     }   
    }  
四、記錄使用者的訪問操作器
package cn.stone.model;

import java.io.IOException;
import java.text.SimpleDateFormat;

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;

public class ObserveFilter implements Filter {

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 記錄使用者的訪問操作
		HttpServletRequest request1 = (HttpServletRequest) request;
		StringBuffer url = request1.getRequestURL();

		// 對url進行過濾,如果是js/css/image則不進行處理
		if (judgeFile(url.toString())) {
			String operTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
					.format(new java.util.Date());
			String hostIp = request.getRemoteAddr();
			String sessionId = request1.getRequestedSessionId();
			String userId = "";
			Person person = (Person) request1.getSession().getAttribute(
					"userObj");
			if (null != person && null != person.getUser()) {
				userId = person.getUser().getId();
			}
			String queryString = request1.getQueryString();
			if (null != queryString) {
				url.append('?');
				url.append(queryString);
			}

			// 儲存到資料庫中
			saveToDb(userId, hostIp, sessionId, url.toString(), operTime, "");
		}
		// Pass control on to the next filter
		chain.doFilter(request, response);
	}

	public boolean judgeFile(String url) {
		if (url.endsWith(".gif") || url.endsWith(".jpg")
				|| url.endsWith(".png") || url.endsWith(".bmp")
				|| url.endsWith(".css") || url.endsWith(".js")
				|| url.endsWith(".jsx")) {
			return false;
		} else {
			return true;
		}
	}

	public int saveToDb(String userId, String hostIp, String sessionId,
			String url, String operTime, String desc) {
		// 將報表任務資料儲存到資料庫中
		Connection conn = null;
		Statement st = null;
		try {

			// 構造sql表示式,將資料插入資料庫
			conn = ServiceAccess.getSystemSupportService()
					.getDefaultConnection();
			st = conn.createStatement();
			String sql = "insert into LOG_OBSERVE_HISTORY(USERID,URL,Detail,SessionID,HostName,StartDate)   values('"
					+ userId
					+ "','"
					+ url
					+ "','"
					+ desc
					+ "','"
					+ sessionId
					+ "','" + hostIp + "','" + operTime + "')";
			if (ServiceAccess.getSystemSupportService().getConnectionType(conn) == ServiceAccess
					.getSystemSupportService().JCA_TYPE_ORACLE) {
				sql = "insert into LOG_OBSERVE_HISTORY(Id,USERID,URL,Detail,SessionID,HostName,StartDate)  values(LOG_OBSERVE_SEQ.nextval,'"
						+ userId
						+ "','"
						+ url
						+ "','"
						+ desc
						+ "','"
						+ sessionId
						+ "','"
						+ hostIp
						+ "',TO_DATE('"
						+ operTime
						+ "','YYYY-MM-DD HH24:MI:SS'))";
			}
			st.executeUpdate(sql);
		} catch (Exception e) {
			e.printStackTrace();
			log.error("--------------------The url String is:" + url
					+ "-------------------------------");
			return 1; // 表示操作失敗
		} finally {
			if (null != st) {
				try {
					st.close();
				} catch (Exception e) {
					e.printStackTrace();
				}

				st = null;
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
				conn = null;
			}
		}
		return 0; // 表示操作成功
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}
}


五.Filter防止使用者訪問一些未被授權的資源

package cn.stone.model;

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;

public class AuthFilter implements Filter {

	public void destroy() {

	}

	public void doFilter(ServletRequest servletRequest,
			ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
		// 1,doFilter方法的第一個引數為ServletRequest物件。此物件給過濾器提供了對進入的資訊(包括表單資料、cookie和HTTP請求頭)的完全訪問。
		//第二個引數為ServletResponse,通常在簡單的過濾器中忽略此引數。
		//最後一個引數為FilterChain,此引數用來呼叫servlet或JSP頁。

		HttpServletRequest request = (HttpServletRequest) servletRequest;// ;//如果處理HTTP請求,並且需要訪問諸如getHeader或getCookies等在ServletRequest中無法得到的方法,就要把此request物件構造成HttpServletRequest
		HttpServletResponse response = (HttpServletResponse) servletResponse;
		
		String currentURL = request.getRequestURI();// 取得根目錄所對應的絕對路徑:
		String targetURL = currentURL.substring(currentURL.indexOf("/", 1),currentURL.length()); // 擷取到當前檔名用於比較
		HttpSession session = request.getSession(false);

		if (!"/login.jsp".equals(targetURL)) {// 判斷當前頁是否是重定向以後的登入頁面頁面,如果是就不做session的判斷,防止出現死迴圈
			if (session == null || session.getAttribute("user") == null) {// *使用者登入以後需手動新增session
				System.out.println("request.getContextPath()="+ request.getContextPath());
				response.sendRedirect(request.getContextPath() + "/login.jsp");// 如果session為空表示使用者沒有登入就重定向到login.jsp頁面
				return;
			}
		}
		// 加入filter鏈繼續向下執行
		filterChain.doFilter(request, response);// .呼叫FilterChain物件的doFilter方法。Filter介面的doFilter方法取一個FilterChain物件作為它的一個引數。在呼叫此物件的doFilter方法時,啟用下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被啟用。
	}

	public void init(FilterConfig filterConfig) throws ServletException {

	}
}



相關推薦

javaFilter用法

一、使瀏覽器不快取頁面的過濾器 import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 用於的使 Browser 不

JavaIterator用法整理

mil rem println 對象 獲得 返回 new ext 插入 叠代器(Iterator)   叠代器是一種設計模式,它是一個對象,它可以遍歷並選擇序列中的對象,而開發人員不需要了解該序列的底層結構。叠代器通常被稱為“輕量級”對象,因為創建它的代價小。   Java

Javavector用法整理

遍歷 檢索 集合 ash ets toa java code lan ArrayList會比Vector快,他是非同步的,如果設計涉及到多線程,還是用Vector比較好一些 import java.util.*; /** * 演示Vector的使用。包括Vector的創

【本地資源路徑&&網絡資源路徑&&正反斜杠在Java用法

mage pow cnblogs 環境 而在 來看 pan 開始 命令行 一、概念和用法 左正右反 先來看看轉義字符的概念:通過 \ ,?來轉變後面字母或符號的含義。意思就是改變字母本身的含義。 以"\"符號為例,JAVA中有很多操作,例如文件操作等,需要用到路徑這個東

JavacompareTo用法及原始碼解析

最近遇到一個問題,在日期比較的時候,很麻煩,因為日期比較沒有大於等於,只有大於或者小於,這就導致在比較時間的時候特別麻煩,而且還要由string轉成date格式才能比較,下面是我使用compareTo比較時間字串的程式碼: String putStartTime = Date

JavaSimpleDateFormat用法詳解

轉自:http://blog.csdn.net/linbooooo1987/article/details/7540999 [java]  view plain  copy

javajson用法整理

阿里家的json 日常開發中遇到各種json,感覺用的比較亂,在這裡先著重整理一下阿里家的json用法。 Step1:maven配置 <dependency> <groupId>com.alibaba</groupId>

javaFilter過濾器處理中文亂碼的方法

注意問題:在學習用selvert的過濾器filter處理中文亂碼時,在filter配置初始化時用了utf-8處理中文亂碼,而在提交的jsp頁面中卻用了gbk。雖然兩種都可以出來中文亂碼,但是卻造成了處理亂碼的格式不一致。所以編譯出錯。 解決方法:所有地方都用ut

javathis用法總結

1,當局部變數和成員變數重名的時候,在方法中使用this表示成員變數以示區分。 class Demo{ String str = "這是成員變數"; void fun(String str){ System.out.println(str);

javaBigInteger用法

1.賦值: BigInteger a=new BigInteger("1"); BigInteger b=BigInteger.valueOf(1); 2.運算: ① add(); 大整數相加  BigInteger a=new BigInteger(“23”); 

詳解JavaMap用法

Map以按鍵/數值對的形式儲存資料,這裡要特別說明( Map.Entry,是Map的內部類,它用來描述Map中的鍵/值對)。 Map是一個介面,我們平時多用它的實現類HashMap。 用例如下: 1 public static void main(String args

this在java用法

this在java中的用法 1.使用this關鍵字引用成員變數 作用:解決成員變數與引數或區域性變數命名衝突的問題 public class Dog { String name; public Dog(String name) { this.name = name;

javaArrayList用法詳解,基本用法(含增刪改查)

1、什麼是ArrayList ArrayList就是動態陣列,它提供了①動態的增加和減少元素 ②實現了ICollection和IList介面 ③靈活的設定陣列的大小ArrayList是一個其容量能夠動態增長的動態陣列。它繼承了AbstractList,實現了List、Rand

javaQueryRunner用法(增、刪、改、查詳解)

1.匯入相應的JARs MySQL驅動jar包:mysql-connector-Java-5.1.28-bin.jar C3P0需要的jar包:c3p0-0.9.2-pre1.jar和mchange-commons-0.2.jar 2.在src下新增C3P0配置

Javareturn用法.

對於return的用法看的不是特別明白,先記著,有空再說。。。 Java中的return語句總是和方法有密切關係,return語句總是用在方法中,有兩個作用,一個是返回方法指定型別的值(這個值總是確定的),一個是結束方法的執行(僅僅一個return語句)。 以下是無

JavacompareTo用法

Java中的compareto方法,返回參與比較的前後兩個字串的asc碼的差值 String a = "a"; String b = "b"; System.out.println(a.compareTo(b)); 輸出值-1 1 2 3 4 5 String a = "

JAVAString 用法

1,獲取 1.1:字串中包含的字元數,也就是字串的長度。 int length():獲取長度 1.2:根據位置獲取位置上某個字元。 char charAt(int index) 1.3:根據字元獲取該字元在字串中的位置。 int i

javastatic用法理解

static關鍵字1.修飾成員變數在我們平時的使用當中,static最常用的功能就是修飾類的屬性和方法,讓他們成為類的成員屬性和方法,我們通常將用static修飾的成員稱為類成員或者靜態成員,這句話挺起來都點奇怪,其實這是相對於物件的屬性和方法來說的。請看下面的例子:(未避免程式太過臃腫,暫時不管訪問控制)p

static在java用法

static表示“全域性”或者“靜態”的意思,用來修飾成員變數和成員方法,也可以形成靜態static程式碼塊,但是Java語言中沒有全域性變數的概念。 被static修飾的成員變數和成員方法獨立於該類的任何物件。也就是說,它不依賴類特定的例項,被類的所有例項共享。 只要這個

java .split( )用法

print rgs 福建 河北 sta 新疆 陜西 方法 雲南 創建main方法: public class StrTest { public static void main(String[] args) { String str = "北京,天津,上海,重慶,