posts - 110, comments - 101, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          “為什么存儲密碼用字符數組比字符串更合適”這個問題是我的一個朋友在最近一次面試中提到的。那哥們是應聘的是一個技術lead的職位,有超過六年的工作經驗。字符數組和字符串都可以用于存儲文本數據,但是在選擇具體哪一種時,如果你沒有針對具體的情況是很難回答這個問題的。但是正如這哥們說的任何與字符串相關的問題一定有線索可以在字符串的屬性里面找到,比如不可變性。他就用這種方式去說服面試官。這里我們就來探討一些關于為什么你應該使用char[] 來存儲密碼而不是字符串。

          1. 因為字符串是不可變對象,如果作為普通文本存儲密碼,那么它會一直存在內存中直至被垃圾收集器回收。因為字符串從字符串池中取出的(如果池中有該字符串就直接從池中獲取,否則new 一個出來,然后把它放入池中),這樣有很大的機會長期保留在內存中,這樣會引發安全問題。因為任何可以訪問內存的人能以明碼的方式把密碼dump出來。另外你還應該始終以加密而不是普通的文本來表示密碼。因為字符串是不可變,因此沒有任何方法可以改變其內容,任何改變都將產生一個新的字符串,而如果使用char[],你就可以設置所有的元素為空或者為零(這里作者的意思是說,讓認證完后該數組不再使用了,就可以用零或者null覆蓋原來的密碼,防止別人從內存中dump出來)。所以存儲密碼用字符數組可以明顯的減輕密碼被盜的危險。

          2. Java官方本身也推薦字符數組,JpasswordField的方法getPassword()就是返回一個字符數組,而由于安全原因getText()方法是被廢棄掉的,因為它返回一個純文本字符串。跟隨Java 團隊的步伐吧,沒有錯。

          3. 字符串以普通文本打印在在log文件或控制臺中也易引起危險,但是如果使用數組你不能打印數組的內容,而是它的內存地址。盡管這不是它的真正原因,但仍值得注意。

          1
          2
          3
          4
          5
          6
          7
          String strPassword="Unknown";
          char[] charPassword= new char[]{'U','n','k','w','o','n'};
          System.out.println("String password: " + strPassword);
          System.out.println("Character password: " + charPassword);
            
          String password: Unknown
          Character password: [C@110b053
          1
           

          以上所有就是為什么字符數組比字符串保存密碼要好的原因,盡管使用char[]還不足以安全。我同樣建議你用hash或者密碼加密代替普通文本,而且一旦認證完成盡可能快的把他清除掉。

          posted @ 2013-11-05 20:00 云云 閱讀(1014) | 評論 (0)編輯 收藏

          MyISAM:這個是默認類型,它是基于傳統的ISAM類型,ISAM是Indexed Sequential Access Method (有索引的順序訪問方法) 的縮寫,它是存儲記錄和文件的標準方法.與其他存儲引擎比較,MyISAM具有檢查和修復表格的大多數工具. MyISAM表格可以被壓縮,而且它們支持全文搜索.它們不是事務安全的,而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執行大量的SELECT,MyISAM是更好的選擇。

            InnoDB:這種類型是事務安全的.它與BDB類型具有相同的特性,它們還支持外鍵.InnoDB表格速度很快.具有比BDB還豐富的特性, 因此如果需要一個事務安全的存儲引擎,建議使用它.如果你的數據執行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表,

            對于支持事物的InnoDB類型的標,影響速度的主要原因是AUTOCOMMIT默認設置是打開的,而且程序沒有顯式調用BEGIN 開始事務,導致每插入一條都自動Commit,嚴重影響了速度。可以在執行sql前調用begin,多條sql形成一個事物(即使autocommit打開也可以),將大大提高性能。

            ===============================================================

            InnoDB和MyISAM是在使用MySQL最常用的兩個表類型,各有優缺點,視具體應用而定。下面是已知的兩者之間的差別,僅供參考。

            innodb

            InnoDB 給 MySQL 提供了具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行鎖(locking on row level),提供與 Oracle 類型一致的不加鎖讀取(non-locking read in SELECTs)。這些特性均提高了多用戶并發操作的性能表現。在InnoDB表中不需要擴大鎖定(lock escalation),因為 InnoDB 的列鎖定(row level locks)適宜非常小的空間。InnoDB 是 MySQL 上第一個提供外鍵約束(FOREIGN KEY constraints)的表引擎。

            InnoDB 的設計目標是處理大容量數據庫系統,它的 CPU 利用率是其它基于磁盤的關系數據庫引擎所不能比的。在技術上,InnoDB 是一套放在 MySQL 后臺的完整數據庫系統,InnoDB 在主內存中建立其專用的緩沖池用于高速緩沖數據和索引。 InnoDB 把數據和索引存放在表空間里,可能包含多個文件,這與其它的不一樣,舉例來說,在 MyISAM 中,表被存放在單獨的文件中。InnoDB 表的大小只受限于操作系統的文件大小,一般為 2 GB。

            InnoDB所有的表都保存在同一個數據文件 ibdata1 中(也可能是多個文件,或者是獨立的表空間文件),相對來說比較不好備份,免費的方案可以是拷貝數據文件、備份 binlog,或者用 mysqldump。

            MyISAM

            MyISAM 是MySQL缺省存貯引擎 .

            每張MyISAM 表被存放在三個文件 。frm 文件存放表格定義。 數據文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。

            因為MyISAM相對簡單所以在效率上要優于InnoDB..小型應用使用MyISAM是不錯的選擇.

            MyISAM表是保存成文件的形式,在跨平臺的數據轉移中使用MyISAM存儲會省去不少的麻煩

            以下是一些細節和具體實現的差別:

            1.InnoDB不支持FULLTEXT類型的索引。

            2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的。

            3.對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引。

            4.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。

            5.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用。

            另外,InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”

            任何一種表都不是萬能的,只用恰當的針對業務類型來選擇合適的表類型,才能最大的發揮MySQL的性能優勢。

            ===============================================================

            以下是InnoDB和MyISAM的一些聯系和區別!

            1. 4.0以上mysqld都支持事務,包括非max版本。3.23的需要max版本mysqld才能支持事務。

            2. 創建表時如果不指定type則默認為myisam,不支持事務。

            可以用 show create table tablename 命令看表的類型。

            2.1 對不支持事務的表做start/commit操作沒有任何效果,在執行commit前已經提交,測試:

            執行一個msyql:

            use test;

            drop table if exists tn;

            create table tn (a varchar(10)) type=myisam;

            drop table if exists ty;

            create table ty (a varchar(10)) type=innodb;

            begin;

            insert into tn values('a');

            insert into ty values('a');

            select * from tn;

            select * from ty;

            都能看到一條記錄

            執行另一個mysql:

            use test;

            select * from tn;

            select * from ty;

            只有tn能看到一條記錄

            然后在另一邊

            commit;

            才都能看到記錄。

            3. 可以執行以下命令來切換非事務表到事務(數據不會丟失),innodb表比myisam表更安全:

            alter table tablename type=innodb;

            3.1 innodb表不能用repair table命令和myisamchk -r table_name

            但可以用check table,以及mysqlcheck [OPTIONS] database [tables]

            4. 啟動mysql數據庫的命令行中添加了以下參數可以使新發布的mysql數據表都默認為使用事務(

            只影響到create語句。)

            --default-table-type=InnoDB

            測試命令:

            use test;

            drop table if exists tn;

            create table tn (a varchar(10));

            show create table tn;

            5. 臨時改變默認表類型可以用:

            set table_type=InnoDB;

            show variables like 'table_type';

            或:

            c:\mysql\bin\mysqld-max-nt --standalone --default-table-type=InnoDB

          posted @ 2013-11-05 14:27 云云 閱讀(324) | 評論 (0)編輯 收藏

          今天遇到這坑爹的事情, eclipse導入的工程運行總是報java.lang.NoNoClassDefFoundError錯誤
          如果是自己創建的工程沒遇到這樣的錯誤
          eclipse沒有把工程編繹到classes目錄下,該目錄下為空


          查看工程目錄中bin路徑下沒有生成對應的.class文檔

          網上查閱了很多資料,大部分都指示classpath設置不對。但是Eclipse本身并不需要配置classpath仍然可以正確運行。

          最終,在網絡上找到一盞明燈,方法如下:
          把properties屬性里的java compiler-->building-->abort build when build path errors occur 前的勾去掉了
          這樣就ok 了

          posted @ 2013-10-23 15:32 云云 閱讀(398) | 評論 (0)編輯 收藏

          public synchronized void methodA(int a, int b);

          public synchronized void methodB(int a){
          methodA(a, 0);
          }

          這樣的代碼是成立的,一個線程對同一個對象的鎖可以反復獲取。這種同步鎖稱為可重入的鎖。
          加在非static方法上的synchronized方法是和synchronized(this)塊等價的,均為對象鎖,即對this加鎖。
          獲得當前對象鎖的線程,可以繼續獲得當前對象鎖,JVM負責跟蹤對象被加鎖的次數。線程運行B方法,此時如果this鎖可以用,線程獲得該鎖,線程給對象加鎖,計數器變成1,然后B方法調用A方法,由于是對同一個對象同一個線程,線程可以繼續獲得鎖,計數器變為2,表示this被加鎖2次。A方法完畢后,線程釋放鎖,計數器變為1,此時對象鎖對其他線程依然是不可獲得的。B方法完畢后,線程繼續釋放鎖,此時計數器變為0,表示鎖被完全釋放,其他線程可以獲得對象鎖。

          public synchronized void methodA(int a, int b){

          }


          public synchronized void methodB(int a, int b){

          }

          以上兩方法在同一實例對象上是互斥的,synchronized 加在方法上 即對this加鎖,因此在同一實例對象上 兩方法是互斥的。


          posted @ 2013-10-13 23:17 云云 閱讀(467) | 評論 (0)編輯 收藏

               摘要: 當一個類中有聲明為static final的變量,這樣的變量對類的加載器有一定的影響,首先看看下面的例子。package com.bird.classLoad;   class FinalTest{            public static&...  閱讀全文

          posted @ 2013-07-21 15:20 云云 閱讀(310) | 評論 (0)編輯 收藏

          Sequence是數據庫系統的特性,有的數據庫有Sequence,有的沒有。比如Oracle、DB2、PostgreSQL數據庫有Sequence,MySQL、SQL Server、Sybase等數據庫沒有Sequence。
          定義一個seq_test,最小值為10000,最大值為99999999999999999,從20000開始,增量的步長為1,緩存為20的循環排序Sequence。
          Oracle的定義方法:
          create sequence seq_test
          minvalue 10000
          maxvalue 99999999999999999
          start with 20000
          increment by 1
          cache 20
          cycle
          order;
          Sequence與indentity的基本作用都差不多。都可以生成自增數字序列。
          Sequence是數據庫系統中的一個對象,可以在整個數據庫中使用,和表沒有任何關系;indentity僅僅是指定在表中某一列上,作用范圍就是這個表。

          一個表中可以有多個字段使用sequence字段
          insert into temp(event_id,event_priority,event_status) values(sequence1.nextval, sequence1.nextval,sequence1.nextval);

          mysql 實現sequence

          由于mysql不帶sequence,所以要手寫的,創建一張儲存sequence的表(tb_sequence),然后手動插入一條數據 ,最后自定義一個函數來處理要增長的值。

          1、創建表tb_sequence,用來存放sequence值:

           create table tb_sequence(name varchar(50) not null,current_value int not null,_increment int not null default 1, primary key(name));   
          2 手動插入數據: 
            insert into tb_sequence values('userid',100,2);  
          3、定義函數 _nextval:
          1. DELIMITER //  
          2. create function _nextval(n varchar(50)) returns integer   
          3. begin  
          4. declare _cur int;  
          5. set _cur=(select current_value from tb_sequence where name= n);  
          6. update tb_sequence  
          7.  set current_value = _cur + _increment  
          8.  where name=n ;  
          9. return _cur;  
          10. end;  
          檢驗結果

           

          select _nextval('userid');  



          posted @ 2013-07-19 21:39 云云 閱讀(2896) | 評論 (1)編輯 收藏

               摘要: (1)BitSet類大小可動態改變, 取值為true或false的位集合。用于表示一組布爾標志。 此類實現了一個按需增長的位向量。位 set 的每個組件都有一個 boolean 值。用非負的整數將 BitSet 的位編入索引。可以對每個編入索引的位進行測試、設置或者清除。通過邏輯與、邏輯或和邏輯異或操作,可以使用一個 BitSet 修改另一個 BitSet 的內容。 默認情況下,set 中所有位...  閱讀全文

          posted @ 2013-06-14 11:24 云云 閱讀(5061) | 評論 (0)編輯 收藏

               摘要: 普通泛型 Java代碼 class Point<T>{ // 此處可以隨便寫標識符號,T是type的簡稱 private T var ; // var的類型由T指定,即:由外部指定 public T getVar(){ // 返回值的類型由外部決定 return var ; } public void setVar(T var){ // 設置的類型也由外部決定 this....  閱讀全文

          posted @ 2013-06-04 21:03 云云 閱讀(307) | 評論 (0)編輯 收藏

          nbtstat -a IP
          nbtstat -anp 10.14x.1x.26x
          通過ip 反查 局域網 機器名
          注冊服務會經常用到

          posted @ 2013-06-04 18:29 云云 閱讀(355) | 評論 (0)編輯 收藏

          1  depoly: 
              mvn clean source:jar deploy -Denforcer.skip=true -Dmaven.test.skip=true -U

          2  packet
              mvn clean install -Dmaven.test.skip=true -Denforcer.skip=true -U

          3 eclipse

            mvn eclipse:eclipse -Dwtpversion=2.0 -Denforcer.skip=true  -DdownloadJavadocs=true -o
          pause

          posted @ 2013-04-07 14:20 云云 閱讀(470) | 評論 (0)編輯 收藏

          僅列出標題
          共12頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 库伦旗| 阳西县| 宜丰县| 平罗县| 台前县| 新和县| 汕头市| 中超| 五台县| 光泽县| 汝南县| 灌阳县| 福泉市| 司法| 镶黄旗| 巴林右旗| 运城市| 昆山市| 繁峙县| 巴里| 永嘉县| 黑河市| 隆尧县| 左贡县| 平乐县| 崇仁县| 布尔津县| 仲巴县| 台前县| 卓尼县| 周宁县| 贡山| 平顶山市| 同心县| 鹰潭市| 汝南县| 云龙县| 东乌| 嵊泗县| 进贤县| 南昌县|