最近的幾十年內(nèi),計算模型發(fā)生了巨大的變化,由于這些變化,出現(xiàn)了對大規(guī)模電子商務(wù)與電子交易系統(tǒng)應(yīng)用程序安全的更大需求,這正如最近對幾個受歡迎站點的大量拒絕服務(wù) (DoS) 攻擊所表明的那樣。
尤其是對于 Java 團體,隨著 Java 作為因特網(wǎng)編程的 事實上的 標(biāo)準(zhǔn)平臺出現(xiàn),安全移動 Java 代碼的能力已成為基本要求。 本文是系列文章中的第一篇,討論計算機安全和密碼學(xué)的一般概念。
雖然可移動代碼并不是一個革命性的概念,但是 Java 和因特網(wǎng)給計算機安全帶來了一些不同尋常的挑戰(zhàn)。Java 體系結(jié)構(gòu)的演化及其對安全的影響、不同的安全 API 和工具軟件以及 applet 安全,等等,將在隨后的文章中討論。
此安全性論文系列并不打算提供計算機安全問題的綜合指南。計算機安全是一個多層面的問題,它涉及若干學(xué)科、部門和文化。
技術(shù)投資后,接著就應(yīng)該著手培訓(xùn)、嚴(yán)格的策略強制執(zhí)行和總體安全策略的定期審查。 注:有關(guān)算法進展的詳細(xì)信息,請參閱專題“ 二十一世紀(jì)的加密算法”;有關(guān)密鑰長度在安全性中的重要性的討論,請參閱專題“ 密鑰的長度是否重要?”。
什么是計算機安全? 要從總體上理解什么是計算機安全,有必要考慮一下安全在日常生活中意味著什么。我們將看到,日常生活中的一般安全規(guī)則同樣適用于計算機安全。
計算機安全的局限性 有沒有絕對計算機安全這樣的事情?一句話,沒有這樣的事情。術(shù)語 安全系統(tǒng)是一個不恰當(dāng)?shù)拿Q,因為它暗示了系統(tǒng)要么是安全的,要么是不安全的。
安全實際上是一種平衡。如果提供的資源是無限的,則任何形式的安全都能遭到破壞。
盡管攻擊者可用來實施攻擊的資源越來越多,但在現(xiàn)實世界中,這些資源仍然是有限的??紤]到這一點,我們應(yīng)該這樣來設(shè)計所有系統(tǒng):讓攻擊者為破壞這些系統(tǒng)所付出的,遠遠大于破壞之后他們所能得到的。
端到端的安全 什么是端到端的安全?在一個多層系統(tǒng)中,每一層都應(yīng)該有其自身的安全,并且與其他層協(xié)調(diào)一致。為匯集在一起的不同系統(tǒng)和中間件設(shè)計安全,是一個相當(dāng)大的挑戰(zhàn)。
簡單地說,系統(tǒng)安全的程度僅相當(dāng)于最弱的一環(huán)的安全程度;除非您按端到端的觀點考慮安全,否則安全隨時可以遭到破壞。 簡單性 一個復(fù)雜的安全設(shè)計會起作用嗎?乍看起來,制止未授權(quán)用戶訪問系統(tǒng)的最佳方法也許是,設(shè)計一個非常復(fù)雜的安全方案,但事實并非如此。
不僅設(shè)計復(fù)雜的安全系統(tǒng)的高成本使人不敢問津,而且,要是這種安全系統(tǒng)太復(fù)雜了,恐怕連合法用戶也難以進入。另一方面,簡單系統(tǒng)更容易理解,也更容易分析。
好的系統(tǒng)設(shè)計需要安全 有可能對安全進行翻新嗎?答案是,這幾乎是不可能的。在很多情況下,翻新安全而不必重新設(shè)計系統(tǒng)的實質(zhì)性部分,可能是不現(xiàn)實的。
在幾乎所有的情況下,翻新的成本非常昂貴。因此,安全從來不應(yīng)是事后考慮的事情 -- 從一開始它就必須是系統(tǒng)設(shè)計的不可分割的一部分。
計算機安全的基礎(chǔ)知識 了解這樣一些內(nèi)容是有用的:計算機安全的防御對象、相應(yīng)的防御機制,以及與計算機安全有關(guān)的不同術(shù)語。 威脅 威脅 -- 對計算機安全的攻擊 -- 大致可以分為以下幾類: 機密性攻擊:利用加密算法中的弱點或以其他方式,試圖竊取機密信息。
完整性攻擊:出于自私或惡意而試圖修改信息。應(yīng)該注意的是,完整性攻擊也可以是偶然的。
可用性攻擊:試圖中斷系統(tǒng)的正常運行。可用性攻擊又稱為 拒絕服務(wù) (DoS) 攻擊,后者是最近流行的術(shù)語。
對付高嚴(yán)重性暴露的技巧請遵循下列建議以避免高嚴(yán)重性靜態(tài)安全性暴露:限制對變量的訪問 讓每個類和方法都成為 final,除非有足夠的理由不這樣做 不要依賴包作用域 使類不可克隆 使類不可序列化 使類不可逆序列化 避免硬編碼敏感數(shù)據(jù) 查找惡意代碼 限制對變量的訪問如果將變量聲明為 public,那么外部代碼就可以操作該變量。
這可能會導(dǎo)致安全性暴露。影響 如果實例變量為 public,那么就可以在類實例上直接訪問和操作該實例變量。
將實例變量聲明為 protected 并不一定能解決這一問題:雖然不可能直接在類實例基礎(chǔ)上訪問這樣的變量,但仍然可以從派生類訪問這個變量。清單 1 演示了帶有 public 變量的代碼,因為變量為 public 的,所以它暴露了。
清單 1. 帶有 public 變量的代碼 class Test { public int id; protected String name; Test(){ id = 1; name = "hello world"; } //code}public class MyClass extends Test{ public void methodIllegalSet(String name){ this.name = name; // this should not be allowed } public static void main(String[] args){ Test obj = new Test(); obj.id = 123; // this should not be allowed MyClass mc = new MyClass(); mc.methodIllegalSet("Illegal Set Value"); }}建議 一般來說,應(yīng)該使用取值方法而不是 public 變量。按照具體問題具體對待的原則,在確定哪些變量特別重要因而應(yīng)該聲明為 private 時,請將編碼的方便程度及成本同安全性需要加以比較。
清單 2 演示了以下列方式來使之安全的代碼:清單 2. 不帶有 public 變量的代碼 class Test { private int id; private String name; Test(){ id = 1; name = "hello world"; } public void setId(int id){ this.id = id; } public void setName(String name){ this.name = name; } public int getId(){ return id; } public String getName(){ return name; }}讓每個類和方法都為 final不允許擴展的類和方法應(yīng)該聲明為 final。這樣做防止了系統(tǒng)外的代碼擴展類并修改類的行為。
影響 僅僅將類聲明為非 public 并不能防止攻擊者擴展類,因為仍然可以從它自己的包內(nèi)訪問該類。建議 讓每個類和方法都成為 final,除非有足夠的理由不這樣做。
按此建議,我們要求您放棄可擴展性,雖然它是使用諸如 Java 語言之類的面向?qū)ο笳Z言的主要優(yōu)點之一。在試圖提供安全性時,可擴展性卻成了您的敵人;可擴展性只會為攻擊者提供更多給您帶來麻煩的方法。
不要依賴包作用域沒有顯式地標(biāo)注為 public、private 或 protected 的類、方法和變量在它們自己的包內(nèi)是可訪問的。影響 如果 Java 包不是封閉的,那么攻擊者就可以向包內(nèi)引入新類并使用該新類來訪問您想保護的內(nèi)容。
諸如 java.lang 之類的一些包缺省是封閉的,一些 JVM 也讓您封閉自己的包。然而,您最好假定包是不封閉的。
建議 從軟件工程觀點來看,包作用域具有重要意義,因為它可以阻止對您想隱藏的內(nèi)容進行偶然的、無意中的訪問。但不要依靠它來獲取安全性。
應(yīng)該將類、方法和變量顯式標(biāo)注為 public、private 或 protected 中適合您特定需求的那種。使類不可克隆克隆允許繞過構(gòu)造器而輕易地復(fù)制類實例。
影響 即使您沒有有意使類可克隆,外部源仍然可以定義您的類的子類,并使該子類實現(xiàn) java.lang.Cloneable。這就讓攻擊者創(chuàng)建了您的類的新實例。
拷貝現(xiàn)有對象的內(nèi)存映象生成了新的實例;雖然這樣做有時候是生成新對象的可接受方法,但是大多數(shù)時候是不可接受的。清單 3 說明了因為可克隆而暴露的代碼:清單 3. 可克隆代碼 class MyClass{ private int id; private String name; public MyClass(){ id=1; name="HaryPorter"; } public MyClass(int id,String name){ this.id=id; this.name=name; } public void display(){ System.out.println("Id ="+id+""+"Name="+name); }}// hackers code to clone the user classpublic class Hacker extends MyClass implements Cloneable { public static void main(String[] args){ Hacker hack=new Hacker(); try{ MyClass o=(MyClass)hack.clone(); o.display(); } catch( e){ e.printStackTrace(); } }}建議 要防止類被克隆,可以將清單 4 中所示的方法添加到您的類中:清單 4. 使您的代碼不可克隆 public final Object clone() throws java.lang.{ throw new java.lang.(); }如果想讓您的類可克隆并且您已經(jīng)考慮了這一選擇的后果,那么您仍然可以保護您的類。
要做到這一點,請在您的類中定義一個為 final 的克隆方法,并讓它依賴于您的一個超類中的一個非 final 克隆方法,如清單 5 中所示:清單 5. 以安全的方式使您的代碼可克隆 public final Object clone() throws java.lang. { super.clone(); }類中出現(xiàn) clone() 方法防止攻擊者重新定義您的 clone 方法。使類不可序列化序列化允許將類實例中的數(shù)據(jù)保存在外部文件中。
闖入代碼可以克隆或復(fù)制實例,然后對它進行序列化。影響 序列化是令人擔(dān)憂的,因為它允許外部源獲取對您的對象的內(nèi)部狀態(tài)的控制。
這一外部源可以將您的對象之一序列化成攻擊者隨后可以讀取的字節(jié)數(shù)組,這使得攻擊者可以完全審查您的對象的內(nèi)部狀態(tài)。
HttpServletRequest request.getRemoteAddr()//獲取遠程IP地址 HttpServletResponse response.setContentType("text/html;charset=gbk")//設(shè)置發(fā)送方式和字符集 response.getWriter();//獲取輸出對象,構(gòu)造PrintWriter對象 返回響應(yīng) 利用: 1) PrintWriter out = response.getWriter // 用于返回文本數(shù)據(jù)給客戶端 2) ServletOutputStream out = response.getOutputStream // 用于返回二進制數(shù)據(jù)給客戶端 Servlet中從request獲得參數(shù)的方法: String getParameter(String); 有此參數(shù)但無值返回""; 無此參數(shù)則返回:null String[] getParameterValues(String); Map getParameterMap(); Enumeration getParameterNames();獲得的是參數(shù)的名字,需要用名字再去獲得參數(shù)的值 1)請闡述什么是ServletContext? 一種servlet服務(wù)的上下文,每一個servlet實例都對應(yīng)在一個web application中,都屬于這個上下文, 即為這個servletContext. 在一個servlet服務(wù)中,通過getServletContext()方法,獲得上下文;2) 如何在一個Servlet中調(diào)用另外一個Servlet;如何在兩個Servlet之間傳遞數(shù)據(jù) getServletContext().getRequestDispatcher("/xxxx/xxxx").forward(request,response); request.setAttribute("xxxx",xxxx);------>requeset.getAttribute("xxxx"); Servlet中的方法: init(ServletConfig);//初始化Servlet用 init中有異常則servlet直接被回收,無異常則繼續(xù)調(diào)用service()方法 覆蓋父類init(ServletConfig)可能會出錯(因為父類函數(shù)會對config做保存處理,以便以后使用),可以調(diào)用super(config)解決 service(request,response); //具體會調(diào)用HttpServlet的doGet,doPost(程序員在具體的servlet程序中覆蓋了)方法實現(xiàn)功能, destory();//銷毀servlet實例的時候調(diào)用 Servlet生命周期: 裝載,init(),service(),destory()Servlet中進行頁面轉(zhuǎn)發(fā): getServletContext().getRequestDispatcher("/user/user_list.jsp").forward(request, response); 或者: response.sendRedirect(request.getContextPath() + "/find.do"); Request中g(shù)etContextPath、getServletPath、getRequestURI、request.getRealPath的區(qū)別//轉(zhuǎn)載假定你的web application 名稱為news,你在瀏覽器中輸入請求路徑: ; charset=GBK"%>
下面簡單列舉一下學(xué)習(xí)java的一個系統(tǒng)知識點的一些介紹():一:java基礎(chǔ)部分:java基礎(chǔ)的時候,有些知識點是非常重要的,比如循環(huán)系列。
For,while,do-while.這方面只要用心點基本沒什么難點。二:面向?qū)ο螅簅op面向?qū)ο蟮臅r候,偏重理論,相信這方面的文章也很多,可以多看看,在這就不說了。
重點掌握面向?qū)ο蟮娜筇卣骱突驹怼H簀ava核心一:這方面主要偏重API,所以在學(xué)習(xí)了這章的時候,一定要對照API去學(xué)習(xí),多看API,主要就是方法多,string和集合的方法最為重要。
四:java核心二:主要講解了異常,線程和IO流,其實個人認(rèn)為重點掌握線程就行,對于流和異常多寫就行,線程偏重理論也最為重要。五:oracle數(shù)據(jù)庫方面:建議學(xué)習(xí)數(shù)據(jù)庫的時候一定要端正態(tài)度,數(shù)據(jù)庫極為重要,本人當(dāng)時在學(xué)習(xí)這個的時候,一直以為數(shù)據(jù)庫只是為了增刪改查,故沒有認(rèn)真學(xué)習(xí),后期面試的時候吃了不少虧,因為現(xiàn)在軟件公司對數(shù)據(jù)庫的要求跟java一樣重要,基本都會單獨一張筆試題筆試數(shù)據(jù)庫。
六:JDBC/XML系列:JDBC主要是3個核心接口(Connection) (Statement) (ResultSet)的使用,在學(xué)習(xí)的時候,熟練運用3接口,jdbc的原理也相當(dāng)重要,雖然后期學(xué)習(xí)了HIbernate之后,JDBC不需要再用,但其底層原理還是JDBC,而且現(xiàn)在很多軟件公司不一定會用到Hibernate框架,所以建議還是把“本”學(xué)好,XML:重點掌握解析互換的2個核心接口方法。七:HTML/CSS/JS:對于這個,本人相當(dāng)糾結(jié),因為這個有點偏向于美工的意思,所以后期想從事后臺開發(fā)的同學(xué)一般不會太重視,但是現(xiàn)在都是web項目,而且很多軟件公司并不是把許多這方面的事情交給美工(除非是那種有很高要求的靜態(tài)頁面),而且現(xiàn)在html代碼都是在jsp里面寫,所以建議還是好好學(xué)學(xué),因為公司不會讓一個美工去專門為你寫一些簡單的html代碼,包括js!這章其實不難,就是屬性方法知識點比較多,多記記,多寫寫,重在多練!八:Servlet/Jsp:如果想從事web和b/s開發(fā)(現(xiàn)在基本都是web和b/s開發(fā)),這章極為重要,服務(wù)器的訪問以及配置。
tomcat的使用都在這一章,雖然后期struts框架的學(xué)習(xí)簡化了servlet代碼的繁瑣性,但是你可知道現(xiàn)在有些公司只用servlet不用struts!即使用了框架技術(shù)也不一定是struts!servlet跟JDBC一樣都是“本”,而struts和Hibernate一樣都是封裝了它們而后簡化代碼而已。所以只有把“本”學(xué)會了,就不怕框架的變化!jsp就不多說了,如果你學(xué)習(xí)java這個就不會缺少!后期b/s項目頁面的布局以及功能就全靠它了。
九:Ajax/Jquery:當(dāng)初學(xué)習(xí)這個的時候,本人沒有用心去學(xué),然后結(jié)果就是本人在進公司之后花了一個星期的時間練習(xí)jQuery!這個對于強化web服務(wù)器頁面的功能技術(shù)實在是強大.這個封裝了js對象的技術(shù),可以對jsp頁面元素進行樣式的更改以及操作,想要玩好web項目,這個技術(shù)必須玩好!十:SSH:傳說中的三大框架;Struts:前面已經(jīng)提到,這個框架技術(shù)主要是為了彌補servlet和jsp頁面之間交互的復(fù)雜性,可以有效的提高客戶端與服務(wù)器之間的交互。而且采用了MVC思想進行改善減弱代碼之間的復(fù)雜性。
Hibernate:主要封裝了jdbc的核心功能,可以采用映射方式訪問并操作數(shù)據(jù)庫,一定程度上講是簡化了程序代碼,但前面已經(jīng)提到,由于是框架,而框架是隨著時代而改變的,并且很多公司不一定用到這個框架,所以,只有掌握好JDBC的根本原理,才會更加理解這個框架。Spring框架:其實后期學(xué)框架知識大家都會覺得很無趣和乏味,因為框架的知識都是理論很深的知識點,spring主要是要完善代碼之間的耦合度,包括類似工廠模式的對象自動控制,AOP的事物日志管理等,都其實是為了減少程序員的工作量,但不得不說是有很大的作用的,而且這個框架可以整合JDBC以及Hibernate,struts技術(shù),可以把所有的框架技術(shù)都整合在一起。
相當(dāng)于一塊主板把內(nèi)存,風(fēng)扇,cpu,顯卡都集中在一起。 前面所有的都是個人學(xué)習(xí)之中的一點感受,希望你也能有所感觸,主要想說明的是前面的基礎(chǔ)一定要打好,對于學(xué)習(xí)方法的問題也可以和大家聊一聊,本人在學(xué)習(xí)之初,由于面向?qū)ο蠛图弦恍├碚撦^深的知識點出現(xiàn),導(dǎo)致后期比較注重理論,最終在寫實際項目的時候吃了苦頭,因為代碼量沒有跟上,即使理論都懂,但很多功能還是無法自己寫出,所以要強調(diào)的是在注重理論的情況下一定要多寫代碼,我的建議是在理論比較深刻的知識點面前,比如面向?qū)ο?,集合,線程這些知識,多看點理論,而對于html,css以及API方法比較多的知識點的情況下,多寫代碼。
總之,各50%最好!當(dāng)然,這就需要大家付出更多的時間和精力辛苦勤勞下了!其實java的學(xué)習(xí)還是要多練代碼,多思考,舉一反三,任何的知識點只要你認(rèn)真的去做,沒有拿不下的頑石,勤能補拙,相信自己,然后用功,你就勝利了。下面為提供部分本人整理的筆記:String的核心方法:字符串轉(zhuǎn)換整數(shù):Integer.parseInt(字符串變量);整數(shù)轉(zhuǎn)換字符串:String.valueOf(整型變量)日期轉(zhuǎn)字符串:new SimpleDateFormat().format(date類型)返回字符串元素的字符長度:length()方法Int IndexOf。
第2章 一切都是對象2.1 用句柄操縱對象2.2 必須創(chuàng)建所有對象2.2.1 保存在什么地方2.2.2 特殊情況:主類型2.2.3 Java中的數(shù)組2.3 絕對不要清除對象2.3.1 作用域2.3.2 對象的作用域2.4 新建數(shù)據(jù)類型:類2.4.1 字段和方法2.5 方法、自變量和返回值2.5.1 自變量列表2.6 構(gòu)建Java程序2.6.1 名字的可見性2.6.2 使用其他組件2.6.3 static關(guān)鍵字2.7 我們的第一個Java程序2.8 注釋和嵌入文檔2.8.1 注釋文檔2.8.2 具體語法2.8.3 嵌入HTML2.8.4 @see:引用其他類2.8.5 類文檔標(biāo)記2.8.6 變量文檔標(biāo)記2.8.7 方法文檔標(biāo)記2.8.8 文檔示例2.9 編碼樣式2.10 總結(jié)2.11 練習(xí) 第3章 控制程序流程3.1 使用Java運算符3.1.1 優(yōu)先級3.1.2 賦值3.1.3 算術(shù)運算符3.1.4 自動遞增和遞減3.1.5 關(guān)系運算符3.1.6 邏輯運算符3.1.7 按位運算符3.1.8 移位運算符3.1.9 三元if-else運算符3.1.10 逗號運算符3.1.11 字串運算符+3.1.12 運算符常規(guī)操作規(guī)則3.1.13 造型運算符3.1.14 Java沒有“sizeof”3.1.15 復(fù)習(xí)計算順序3.1.16 運算符總結(jié)3.2 執(zhí)行控制3.2.1 真和假3.2.2 if-else3.2.3 反復(fù)3.2.4 do-while3.2.5 for3.2.6 中斷和繼續(xù)3.2.7 切換3.3 總結(jié)3.4 練習(xí) 第4章 初始化和清除4.1 由構(gòu)建器保證初始化4.2 方法過載4.2.1 區(qū)分過載方法4.2.2 主類型的過載4.2.3 返回值過載4.2.4 默認(rèn)構(gòu)建器4.2.5 this關(guān)鍵字4.3 清除:收尾和垃圾收集4.3.1 finalize()用途何在4.3.2 必須執(zhí)行清除4.4 成員初始化4.4.1 規(guī)定初始化4.4.2 構(gòu)建器初始化4.5 數(shù)組初始化4.5.1 多維數(shù)組4.6 總結(jié)4.7 練習(xí) 第5章 隱藏實施過程5.1 包:庫單元5.1.1 創(chuàng)建獨一無二的包名5.1.2 自定義工具庫5.1.3 利用導(dǎo)入改變行為5.1.4 包的停用5.2 Java訪問指示符5.2.1 “友好的”5.2.2 public:接口訪問5.2.3 private:不能接觸5.2.4 protected:“友好的一種”5.3 接口與實現(xiàn)5.4 類訪問5.5 總結(jié)5.6 練習(xí) 第6章 類再生6.1 合成的語法6.2 繼承的語法6.2.1 初始化基礎(chǔ)類6.3 合成與繼承的結(jié)合6.3.1 確保正確的清除6.3.2 名字的隱藏6.4 到底選擇合成還是繼承6.5 protected6.6 遞增開發(fā)6.7 上溯造型6.7.1 何謂“上溯造型”?6.8 final關(guān)鍵字6.8.1 final數(shù)據(jù)6.8.2 final方法6.8.3 final類6.8.4 final的注意事項6.9 初始化和類裝載6.9.1 繼承初始化6.10 總結(jié)6.11 練習(xí) 第7章 多形性7.1 上溯造型7.1.1 為什么要上溯造型7.2 深入理解7.2.1 方法調(diào)用的綁定7.2.2 產(chǎn)生正確的行為7.2.3 擴展性7.3 覆蓋與過載7.4 抽象類和方法7.5 接口7.5.1 Java的“多重繼承”7.5.2 通過繼承擴展接口7.5.3 常數(shù)分組7.5.4 初始化接口中的字段7.6 內(nèi)部類7.6.1 內(nèi)部類和上溯造型7.6.2 方法和作用域中的內(nèi)部類7.6.3 鏈接到外部類7.6.4 static內(nèi)部類7.6.5 引用外部類對象7.6.6 從內(nèi)部類繼承7.6.7 內(nèi)部類可以覆蓋嗎?7.6.8 內(nèi)部類標(biāo)識符7.6.9 為什么要用內(nèi)部類:控制框架7.7 構(gòu)建器和多形性7.7.1 構(gòu)建器的調(diào)用順序7.7.2 繼承和finalize()7.7.3 構(gòu)建器內(nèi)部的多形性方法的行為7.8 通過繼承進行設(shè)計7.8.1 純繼承與擴展7.8.2 下溯造型與運行期類型標(biāo)識7.9 總結(jié)7.10 練習(xí) 第8章 對象的容納8.1 數(shù)組8.1.1 數(shù)組和第一類對象8.1.2 數(shù)組的返回8.2 集合8.2.1 缺點:類型未知8.3 枚舉器(反復(fù)器)8.4 集合的類型8.4.1 Vector8.4.2 BitSet8.4.3 Stack8.4.4 Hashtable8.4.5 再論枚舉器8.5 排序8.6 通用集合庫8.7 新集合8.7.1 使用Collections8.7.2 使用Lists8.7.3 使用Sets8.7.4 使用Maps8.7.5 決定實施方案8.7.6 未支持的操作8.7.7 排序和搜索8.7.8 實用工具8.8 總結(jié)8.9 練習(xí) 第9章 違例差錯控制9.1 基本違例9.1.1 違例自變量9.2 違例的捕獲9.2.1 try塊9.2.2 違例控制器9.2.3 違例規(guī)范9.2.4 捕獲所有違例9.2.5 重新“擲”出違例9.3 標(biāo)準(zhǔn)Java違例9.3.1 RuntimeException的特殊情況9.4 創(chuàng)建自己的違例9.5 違例的限制9.6 用finally清除9.6.1 用finally做什么9.6.2 缺點:丟失的違例9.7 構(gòu)建器9.8 違例匹配9.8.1 違例準(zhǔn)則9.9 總結(jié)9.10 練習(xí) 第10章 Java IO系統(tǒng)10.1 輸入和輸出10.1.1 InputStream的類型10.1.2 OutputStream的類型10.2 增添屬性和有用的接口10.2.1 通過FilterInputStream從InputStream里讀入數(shù)據(jù)10.2.2 通過FilterOutputStream向OutputStream里寫入數(shù)據(jù)10.3 本身的缺陷:RandomAccessFile10.4 File類10.4.1 目錄列表器10.4.2 檢查與創(chuàng)建目錄10.5 IO流的典型應(yīng)用10.5.1 輸入流10.5.2 輸出流10.5.3 快捷文件處理10.5.4 從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù)10.5.5 管道數(shù)據(jù)流10.6 StreamTokenizer10.6.1 StringTokenizer10.7 Java 1.1的IO流10.7.1 數(shù)據(jù)的發(fā)起與接收10.7.2 修改數(shù)據(jù)流的行為10.7.3 未改變的類10.7.4 一個例子10.7.5 重定向標(biāo)準(zhǔn)IO10.8 壓縮10.8.1 用GZIP進行簡單壓縮10.8.2 用Zip進行多文件保存10.8.3 Java歸檔(jar)實用程序10.9 對象串聯(lián)10.9.1 尋找類10.9.2 序列化的控制10.9.3 利用“持久性”10.10 總結(jié)10.11 練習(xí) 第11章 運行期類型鑒定11.1 對RTTI的需要11.1.1 Class對象11.1.2 造型前的檢查11.2 RTTI語法11.3 反射:運行期類信息11.3.1 一個類方法提取器11.4 總結(jié)11.5 練習(xí) 第12章 傳遞和返回對象12.1 傳遞句柄12.1.1 別名問題12.2 制作本地副本12.2.1 按值傳遞12.2.2 克隆對象12.2.3 使類具有克隆能力12.2.4 成功的克隆12.2.5 Object.clone()的效果12.2.6 克隆合成對象12.2.7 用Vector進行深層復(fù)制12.2.8 通過序。
考試大整理Java技術(shù)知識 一、Java簡介 Java是由美國Sun Microsystem,Inc。
開發(fā)出來的一種面向?qū)ο蟮恼Z言,它已經(jīng)廣泛用于Internet 上以完成一些HTML無法完成的功能。Java有簡單、穩(wěn)定、安全、界面友善等幾大特點,而且對于UNIX,Macintosh或者PC機都能使用,這就是為什么Java如此受歡迎的原因了,Java是由C++衍生過來的,它的風(fēng)格和C++很相似,不過就和C++相比就簡單得多 。
Java由于其指令和結(jié)構(gòu)都是十分嚴(yán)謹(jǐn)?shù)模沂菍iT為不同環(huán)境些執(zhí)行所設(shè)計,所以Java編寫的程序遠比C++要穩(wěn)定,而且改錯也比較容易。在網(wǎng)絡(luò)上執(zhí)行程序時,Java對安全性的保障具有非常嚴(yán)格的控制,尤其是對用戶端安全的保護以及規(guī)定都有詳盡而嚴(yán)格的規(guī)定。
二、Java的特點 Java在運行機理上和C++很相似,但是兩者也有很多差異: 1、Java不支持結(jié)構(gòu)和指針;在C/C++中,最靈活也是最頭疼的東東就是指針(一說到這個玩意我就全身發(fā)冷),但是在JAVA中,為了保持它的平臺無關(guān)性,Java取消了指針。 2、自動內(nèi)存管理和線索控制。
在C和C++中,內(nèi)存必須用free、malloc和其它許多內(nèi)存管理標(biāo)準(zhǔn)庫管理。因此,系統(tǒng)要了解何時分配、釋放內(nèi)存并且跟蹤所有的內(nèi)存使用情況是非常困難的。
如果要在C和C++中實現(xiàn)線索功能,必須使用一個可對線索進行各種控制的類庫。 而在Java中,盡管線索仍然需要類的支持,但系統(tǒng)卻在語言級包括了線索同步機制。
3、Java具有內(nèi)嵌的內(nèi)存管理程序。一旦創(chuàng)建了一個對象,Java的運行系統(tǒng)就開始跟蹤這個對象,直到不再需要跟蹤該對象的所有引用為止。
當(dāng)某個對象不存在相應(yīng)的引用時,Java把這個對象放到一個用于垃圾搜集的棧內(nèi)。 為在性能損失最小的情況下提供自動垃圾搜集機制,這個垃圾搜集程序?qū)⒃诤笈_或作為低優(yōu)先級線索運行。
這樣,Java的垃圾搜集軟件將在前臺線索的執(zhí)行期間抽空執(zhí)行,或者在系統(tǒng)顯式提出需要使用那些被已經(jīng)死亡的類所占用的內(nèi)存空間時執(zhí)行。 從后臺內(nèi)存管理程序可以很明顯地看出,多線索的確可以增強Java環(huán)境的相對性能。
鑒于多線索的重要性,Java在語言級提供了線索同步機制,使多線索成為一種內(nèi)嵌特性。Java 語言支持針對方法的同步修飾符,并通過該修飾符來指明線索的運行順序。
此外,Java還能控制方法與實例變量的相互作用機制,確保了各方法之間在修改數(shù)據(jù)時不會產(chǎn)生沖突。 Java的內(nèi)存管理和線索支持還具有使Java語言簡單化的作用。
正是由于把內(nèi)存管理任務(wù)嵌入到了Java環(huán)境,Java語言才可以取消指針數(shù)據(jù)類型、malloc和free函數(shù)。這樣,程序員就可以把更多的時間化在真正的編程工作上,而不是去跟蹤調(diào)試與內(nèi)存使用相關(guān)的程序錯誤。
正是由于其多線索機制,Java才可以為一個可移植的解釋系統(tǒng)提供較高的性能。 4、Java的編譯和C/C++大有不同,C/C++的編譯器是將源代碼編譯成某種處理器所能處理的機器碼,而Java編譯器只是將它編譯成一種臨時代碼,稱為字節(jié)碼或虛擬機代碼,通過文件。
class進行存儲,運行時通過Java虛擬機運行,而不基于任何特定處理器。 三、Java在瀏覽器上的運用 首先時網(wǎng)頁制作人員,在HTML代碼中寫入標(biāo)記,在客戶端的瀏覽器遇到該標(biāo)志的時候,如果它與Java兼容的話,就會下載相應(yīng)的類文件,類文件中裝的就是我們剛剛說的字節(jié)碼,瀏覽器中的虛擬機根據(jù)客戶端的處理器將字節(jié)碼轉(zhuǎn)換為特定的機器碼,于是它就在這臺機器上執(zhí)行了。
Java 基本知識點概要1. 了解Java語言的特征,掌握J(rèn)DK(Java開發(fā)工具包)的安裝、目錄層次、環(huán)境變量配置,Java程序的實現(xiàn)過程 a).J2SE 1.6( JDK1.5)的安裝:(推薦路徑) Jdk路徑: C:\Soft\JDK1.6 Jre路徑: C:\program files\Java\jre1.6.0\。
b).環(huán)境變量配置: 我的電腦--〉右擊屬性--〉高級--〉環(huán)境變量--〉新建 變量名 變量值Java_Home C:\Soft\JDK1.6Path %Java_Home%\binClassPath %Java_Home%\jre\lib\rt.jar;.c).編寫Java源文件(Xxx.java)==>編譯成字節(jié)碼 (javac Xxx.java) ==>執(zhí)行字節(jié)碼文件 java Xxx 2.Java語言基礎(chǔ) a). 數(shù)據(jù)類型: 8種基本類型:byte,char,short,int,long,float,double,boolean 引用類型: 數(shù)組, 類,接口 b).結(jié)構(gòu)化語句: if,if--else ,if--else if ,switch--case,while,do--while,for c).數(shù)組 int num[]={1,2,3,4,5}; <> int []num={1,2,3,4,5}; int num[]=new int[size]; int num[]=new int[]{1,2,3,4,5}; 3.面向?qū)ο蟮幕A(chǔ) a).類:具有相同屬性和行為的一組對象的集合 b).對象:客觀存在的或可被描述的抽象對象,具有特定屬性和行為的實體。 c).類是對象的模板(原型),對象是類的具體實例 d).抽象、封裝、繼承,多態(tài)(重載,重寫,接口多實現(xiàn)) e).構(gòu)造方法(默認(rèn)構(gòu)造器/參數(shù)化構(gòu)造器) f).限制訪問修飾符: private,缺?。J(rèn)),protected,public g).附加修飾符:final,static,abstract h).接口 4.Java 基礎(chǔ)包 a). java.lang : 包裝類(Byte,Character,Short,Integer,Long,Float,Double,Boolean) 其它類:String,StringBuffer,Math,Class,Object b). java.util 隨機類:Random 日期類:Date,Calender 集合框架體系:Collection,List,Set,ArrayList,LinkedList,Vector,HashMap c). java.io 文件類:File 字節(jié)流:FileInputStream,FileOutputStream 字符流:FileReader,FileWriter,BufferedReader,BufferedWriter 二進制流:(了解) DataInputStream,DataOutputStream 構(gòu)造鍵盤流:BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); d). java.swt /javax.swing 容器類組件:JFrame,JPanel,JScrollPane 組件: JLabel,JTextField,JPasswordField,JTextArea,JComboBox, JRadioButton,JCheckBox,JMenuBar,JMenu,JMenuItem 5.JDBC 數(shù)據(jù)庫連接 數(shù)據(jù)庫的連接步驟: 1). 加載數(shù)據(jù)庫驅(qū)動類: Class.forName(driver) 2). 通過驅(qū)動程序管理器獲取連接: DriverManager.getConnection(url,user,password) 3). 基于連接對象建立處理器對象/預(yù)處理器對象 Statement stmt=conn.createStatement(); PreparedStatement stmt=conn.prepareStatement("insert into student values(?,?,?,?,?)"); 4). 處理器執(zhí)行SQL命令(Select/Insert/Update/Delete)executeQuery(Select) ==>返回查詢的結(jié)果集(ResultSet, ResultSet.getXXX(列編號,從1開始)) executeUpdate(Insert/Update/Delete) ==>返回執(zhí)行命令影響的記錄行(int) 5). 關(guān)閉各個對象 導(dǎo)入java.sql包 一、加載要連接數(shù)據(jù)庫的驅(qū)動程序 Class.forName(driver) 注:Class.forName()方法將給定的類加載到JVM,如果系統(tǒng)中不存在給定的類, 則會引發(fā)異常 二、通過驅(qū)動程序管理器得到連接實例 Connection conn=DriverManager.getConnection(url,user,pwd); 注1:DriverManager類跟蹤已注冊的驅(qū)動程序,通過getConnection(URL)方法, 找到一個能夠連接至URL中指定的數(shù)據(jù)庫驅(qū)動程序,它接收三個參數(shù), 分別表示: 數(shù)據(jù)源的名稱(類型) 、用戶名(可選)、密碼(可選) 注2: 1). localhost 表示本機,也可以用127.0.0.1 如果你連的不是本機,可能通過 機器名 或 IP(192.111.113.100) 來連接 2). 1433是端口號,SQL server默認(rèn)是1433 , 自己可以手工的改動它 3). databasename后面跟你的數(shù)據(jù)庫的名稱,表示你要連接的數(shù)據(jù)庫是哪個 4). 最后是用戶名及密碼, 當(dāng)前可以訪問該數(shù)據(jù)庫的用戶及密碼 注3:基于不同連接方式和不同類型的數(shù)據(jù)源連接字符串如下: 1. Jdbc-Odbc橋 (SQLServer/Microsoft Access )數(shù)據(jù)庫 1.1 加載驅(qū)動程序: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 1.2 建立數(shù)據(jù)源(控制面板中配置數(shù)據(jù)源,MyDataSource是數(shù)據(jù)源名稱) conn=DriverManager.getConnection("jdbc:odbc:MyDataSource"); 2. 直連SQLServer 驅(qū)動程序: -- SQLServer 2000: 2.1 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 2.2 conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;dataBaseName=DBName","sa",""); -- SQLServer 2005: 3.1 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 3.2 conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433; dataBaseName=DBName","sa",""); -- 直連Access 驅(qū)動程序: 4.1 加載驅(qū)動程序: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 4.2、不建立數(shù)據(jù)源 ,直接寫連接字符串 conn=DriverManager.getConnection("jdbc:odbc:;Driver=Microsoft Access Driver (*.mdb);DBQ=Test.mdb"); 注: 1). DBQ后面指定的是要連接的Access 數(shù)據(jù)庫 2). Microsoft Access driver (*.mdb) 中。
編寫安全的Internet應(yīng)用并不是一件輕而易舉的事情:只要看看各個專業(yè)公告板就可以找到連續(xù)不斷的安全漏洞報告。
你如何保證自己的Internet應(yīng)用不象其他人的應(yīng)用那樣滿是漏洞?你如何保證自己的名字不會出現(xiàn)在令人難堪的重大安全事故報道中?如果你使用Java Servlet 、JavaServer Pages(JSP)或者EJB,許多難以解決的問題都已經(jīng)事先解決。 當(dāng)然,漏洞仍有可能出現(xiàn)。
下面我們就來看看這些漏洞是什么,以及為什么Java程序員不必?fù)?dān)心部分C和Perl程序員必須面對的問題。 C程序員對安全漏洞應(yīng)該已經(jīng)很熟悉,但象OpenBSD之類的工程提供了處理此類問題的安全系統(tǒng)。
Java語言處理這類問題的經(jīng)驗要比C少20年,但另一方面,Java作為一種客戶端編程語言誕生,客戶端對安全的要求比服務(wù)器端苛刻得多。 它意味著Java的發(fā)展有著一個穩(wěn)固的安全性基礎(chǔ)。
Java原先的定位目標(biāo)是瀏覽器。然而,瀏覽器本身所帶的Java虛擬機雖然很不錯,但卻并不完美。
Sun的《Chronology of security-related bugs and issues》總結(jié)了運行時環(huán)境的漏洞發(fā)現(xiàn)歷史。 我們知道,當(dāng)Java用作服務(wù)器端編程語言時,這些漏洞不可能被用作攻擊手段。
但即使Java作為客戶端編程語言,重大安全問題的數(shù)量也從1996年的6個(其中3個是相當(dāng)嚴(yán)重的問題)降低到2000年的1個。不過,這種安全性的相對提高并不意味著Java作為服務(wù)器端編程語言已經(jīng)絕對安全,它只意味著攻擊者能夠使用的攻擊手段越來越受到限制。
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請在一個月內(nèi)通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁面生成時間:3.621秒