在物件複製的過程中,可能會有些敏感欄位的資料不能被複製,例如會員資料的密碼。

此時可以透過 transient 關鍵字對該欄位進行標記,標記後再進行 Clone 時將不會複製該欄位之內容。

( 此方法只有在物件是利用 序列化複製時 有效 )

 

首先製作一個含有敏感欄位的物件,並將其密碼設定為 transient 。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class Login implements Serializable{
	private static final long serialVerionUID = 12855161761717331L;
	private String username;
	private transient String password;	//only work on Serializable
	
	public Login(String username,String password) {
		this.username = username;
		this.password = password;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		StringBuilder sb = new StringBuilder();
		sb.append("使用者名稱 : " + username);
		sb.append("密碼 : " + password);
		return sb.toString();
	}
	
	@Override
	protected Login clone() {
		// TODO Auto-generated method stub
		Login obj = null;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		
		try {
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(this);
			oos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
		
		try {
			ObjectInputStream ois = new ObjectInputStream(bais);
			obj = (Login) ois.readObject();
			ois.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return obj;
	}
}

 

然後透過以下程式碼測試是否有成功避免敏感資訊被複製:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public class Test {
	public static void main(String[] args) {
		Login login = new Login("Lung yu tsai", "tygr123456");
		System.out.println("輸出原始資訊");
		System.out.println(login.toString());
		
		Login login2 = login.clone();
		System.out.println(login2.toString());
	}
}

 

實驗結果如下圖,從圖中可以看到密碼沒有被複製,字串值為null。

image

 

完整專案範例 (連結)

 


實驗個欄位之預設值如下圖所示:

image

 

arrow
arrow
    文章標籤
    java
    全站熱搜
    創作者介紹
    創作者 Lung-Yu,Tsai 的頭像
    Lung-Yu,Tsai

    Lung-Yu,Tsai 的部落格

    Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣()