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

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

          1. 因?yàn)樽址遣豢勺儗ο螅绻鳛槠胀ㄎ谋敬鎯γ艽a,那么它會一直存在內(nèi)存中直至被垃圾收集器回收。因?yàn)樽址畯淖址刂腥〕龅模ㄈ绻刂杏性撟址椭苯訌某刂蝎@取,否則new 一個出來,然后把它放入池中),這樣有很大的機(jī)會長期保留在內(nèi)存中,這樣會引發(fā)安全問題。因?yàn)槿魏慰梢栽L問內(nèi)存的人能以明碼的方式把密碼dump出來。另外你還應(yīng)該始終以加密而不是普通的文本來表示密碼。因?yàn)樽址遣豢勺儯虼藳]有任何方法可以改變其內(nèi)容,任何改變都將產(chǎn)生一個新的字符串,而如果使用char[],你就可以設(shè)置所有的元素為空或者為零(這里作者的意思是說,讓認(rèn)證完后該數(shù)組不再使用了,就可以用零或者null覆蓋原來的密碼,防止別人從內(nèi)存中dump出來)。所以存儲密碼用字符數(shù)組可以明顯的減輕密碼被盜的危險。

          2. Java官方本身也推薦字符數(shù)組,JpasswordField的方法getPassword()就是返回一個字符數(shù)組,而由于安全原因getText()方法是被廢棄掉的,因?yàn)樗祷匾粋€純文本字符串。跟隨Java 團(tuán)隊(duì)的步伐吧,沒有錯。

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

          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
           

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

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

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

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

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

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

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

            innodb

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

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

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

            MyISAM

            MyISAM 是MySQL缺省存貯引擎 .

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

            因?yàn)镸yISAM相對簡單所以在效率上要優(yōu)于InnoDB..小型應(yīng)用使用MyISAM是不錯的選擇.

            MyISAM表是保存成文件的形式,在跨平臺的數(shù)據(jù)轉(zhuǎn)移中使用MyISAM存儲會省去不少的麻煩

            以下是一些細(xì)節(jié)和具體實(shí)現(xiàn)的差別:

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

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

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

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

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

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

            任何一種表都不是萬能的,只用恰當(dāng)?shù)尼槍I(yè)務(wù)類型來選擇合適的表類型,才能最大的發(fā)揮MySQL的性能優(yōu)勢。

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

            以下是InnoDB和MyISAM的一些聯(lián)系和區(qū)別!

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

            2. 創(chuàng)建表時如果不指定type則默認(rèn)為myisam,不支持事務(wù)。

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

            2.1 對不支持事務(wù)的表做start/commit操作沒有任何效果,在執(zhí)行commit前已經(jīng)提交,測試:

            執(zhí)行一個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;

            都能看到一條記錄

            執(zhí)行另一個mysql:

            use test;

            select * from tn;

            select * from ty;

            只有tn能看到一條記錄

            然后在另一邊

            commit;

            才都能看到記錄。

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

            alter table tablename type=innodb;

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

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

            4. 啟動mysql數(shù)據(jù)庫的命令行中添加了以下參數(shù)可以使新發(fā)布的mysql數(shù)據(jù)表都默認(rèn)為使用事務(wù)(

            只影響到create語句。)

            --default-table-type=InnoDB

            測試命令:

            use test;

            drop table if exists tn;

            create table tn (a varchar(10));

            show create table tn;

            5. 臨時改變默認(rèn)表類型可以用:

            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 云云 閱讀(326) | 評論 (0)編輯 收藏

          今天遇到這坑爹的事情, eclipse導(dǎo)入的工程運(yùn)行總是報(bào)java.lang.NoNoClassDefFoundError錯誤
          如果是自己創(chuàng)建的工程沒遇到這樣的錯誤
          eclipse沒有把工程編繹到classes目錄下,該目錄下為空


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

          網(wǎng)上查閱了很多資料,大部分都指示classpath設(shè)置不對。但是Eclipse本身并不需要配置classpath仍然可以正確運(yùn)行。

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

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

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

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

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

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

          }


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

          }

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


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

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

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

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

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

          mysql 實(shí)現(xiàn)sequence

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

          1、創(chuàng)建表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 手動插入數(shù)據(jù): 
            insert into tb_sequence values('userid',100,2);  
          3、定義函數(shù) _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;  
          檢驗(yàn)結(jié)果

           

          select _nextval('userid');  



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

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

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

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

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

          nbtstat -a IP
          nbtstat -anp 10.14x.1x.26x
          通過ip 反查 局域網(wǎng) 機(jī)器名
          注冊服務(wù)會經(jīng)常用到

          posted @ 2013-06-04 18:29 云云 閱讀(356) | 評論 (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 云云 閱讀(471) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共12頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 琼结县| 平罗县| 社会| 金乡县| 广饶县| 山阳县| 庐江县| 恩施市| 双流县| 兴仁县| 罗城| 米林县| 闻喜县| 阿拉善右旗| 永德县| 博罗县| 繁昌县| 霍城县| 简阳市| 龙游县| 泰州市| 贡嘎县| 凤城市| 阿拉尔市| 中山市| 绥芬河市| 巴青县| 双鸭山市| 泸溪县| 彰化县| 阿荣旗| 伊川县| 洛隆县| 涞源县| 博罗县| 安化县| 平顶山市| 镇沅| 青河县| 广汉市| 景德镇市|