本人畢業設計系統附完整文檔和項目代碼

大四期間9月到11月寫的畢業系統,仿照百度文庫設計的,融合了session共享,nginx負載均衡,lucene全文檢索,敏感詞過濾算法,office文件轉pdf並提供免下載在線預覽功能,登錄郵件通知等功能。頁面都是趴的51CTO網站套用的。

下面是截取的部分內容,完整文檔和完整代碼見 https://github.com/intsmaze/FileManage

2系統開發工具與技術

本文件共享管理系統的開發工具使用Eclipse,數據庫採用的是MySQL,服務器採用Tomcat6.0Nginx。在開發中採用Java語言進行開發,項目整體使用Struts2hibernatespring三大框架作爲開發的基本環境,使用Lucene全文檢索框架進行文件的搜索,MyCat中間件處理分佈式數據庫和分佈式事務問題等問題,OpenOfiice技術對office文件轉換爲swf文件時數據內容的提取,頁面採用JSP+HTML+CSS+DIV等技術,Ajax進行請求的異步發送,Java Mail技術對用戶賬號進行驗證,Memached技術實現內存級緩存,同時在項目開發中使用SVN進行項目的版本控制。

3系統規劃與系統分析

3.1系統的總體結構

根據文件共享管理系統的設計需求,確定本系統平臺的整體運作模式要求用戶通過web端進入文件共享系統的首頁系統搜索自己需要的文件,用戶根據系統呈現的數據選擇滿足自己需要的,進而點擊該文件在線預覽以驗證該文件是否符合自己的需要,從而再進行文件的下載。最後用戶也可以上傳自己的文件資源供其他用戶檢索下載,從而達到資源共享的目的。

按照每個用戶可以操作的功能來理清系統整體功能,系統功能模塊圖如圖3.1所示的。

 

4系統設計與實現

4.1系統用戶功能設計

系統用戶分爲三種角色:遊客、用戶、管理員。這三個角色的功能如下所述:

(1)遊客

搜索資料:遊客可以在搜索框輸入要搜索文件的關鍵字進行搜索;

查看文件信息:遊客可以點擊搜索結果列表的文件查看該文件的詳細信息以及其他用戶對該文件的評論;

預覽文件:遊客可以對查看的文件進行在線預覽;

(2)用戶

搜索資料:用戶可以在搜索框輸入要搜索文件的關鍵字進行搜索;

查看文件信息:用戶可以點擊搜索結果列表的文件查看該文件的詳細信息以及其他用戶對該文件的評論;

下載文件:用戶可以下載該文件;

評論文件:用戶可以評論下載過的文件,但只能評論一次;

舉報文件:用戶可以舉報下載過的文件,但只能舉報一次;

上傳文件:用戶可以上傳office文件供其他用戶下載;

用戶註冊:用戶通過郵箱驗證的方式進行註冊;

用戶登錄:用戶登錄成功的同時系統會向用戶手機發送短信告知;

查看個人信息:用戶可以查看個人信息;

修改個人信息:用戶可以修改個人信息;

找回密碼:用戶通過註冊的郵箱信息重設密碼;

(3)管理員

查看投訴列表:管理員查看用戶投訴列表;

處理投訴:對用戶的投訴信息進行查看並處理;

用戶登錄:用戶登錄成功的同時系統會向用戶手機發送短信告知;

查看個人信息:用戶可以查看個人信息;

 

6軟件開發中主要解決的問題

本系統是一個面向互聯網用戶的項目,本系統不僅要保證用戶的賬號安全不被盜用,還有保證本系統中內容的健康性,不散播低俗淫穢內容和用戶體驗的友好和及時性。另外本系統是一個分佈式系統,相比以往的傳統系統有很多挑戰需要解決。

6.1帳號登錄的安全性

因爲系統的網絡連接採用基於sockethttp協議,所以用戶的輸入的賬號密碼在網絡傳輸過程中存在被人劫持而暴露用戶密碼的風險。採用傳統方式web頁面對前端用戶輸入的明文密碼進行加密,然後在網絡中傳輸加密後的密碼,服務器接收到加密碼後與數據庫中的加密的密碼進行比較來驗證用戶是否可以登錄,但是這種方式下盜號者完全不需要知道用戶的明文密碼是多少,只需要劫持到網絡傳輸中的加密後密碼,以後直接發加密密碼即可登錄系統。

因爲以上原因,我們想到的是,用戶在登錄頁面,服務器根據用戶存在與服務器的session生成一個隨機碼保存在服務器中,同時把這個值傳給登錄頁面,登錄頁面獲取這個值後拼接到用戶的密碼明文後面進行加密後通過網絡傳輸到服務器,服務器接受到加密後密碼後,通過服務器存儲的隨機值與數據庫的原始密碼也拼接起來加密後進行比較來驗證用戶登錄,這樣就可以保證用戶每一次登錄時通過網絡發送的加密密碼不一樣,這樣就算被劫持,也無法被人使用。

6.2搜索的精準與快速

如何人性化爲用戶提供精準服務,採用全文檢索——垂直化搜索引擎主要針對系統內部的自有數據的檢索,通過對系統內部數據建立索引提供給用戶進行檢索。

它既能滿足用戶對全文檢索,模糊匹配的需求,解決數據庫like查詢效率低下的問題,又能夠解決分佈式環境下,由於採用分庫分表或使用NoSQL數據庫,導致無法進行多表關聯或者進行復雜查詢的問題。

lucene將文檔中的詞作爲關鍵字,建立詞與文檔的映射關係,通過對倒排索引的檢索,可以根據詞快速獲取包含這個詞的文檔列表。

能對句子或段落進行切割,從中取出包含固定語義的詞。

當輸入一個關鍵字進行搜索時,可能會命中許多文檔,搜索引擎給用戶的價值就是快速地找到需要的文檔,根據排序算法,將相關度更大的內容排在前面,命中多次的文檔比命中一次的文檔有更高的相關性。

6.3文件的處理

傳統系統用戶只能下載文件後才能查看文件內容,並不能讓用戶在文件下載之前就能查看文件的內容,經常導致用戶下載文件後發現文件不是自己想要的,不僅影響用戶的體驗,同時也給網站帶來流量開銷和連接的壓力。爲了實現文件預覽,我們需要將文件轉換爲swf文件,實現flash播放達到預覽,在這裏面我們不僅要考慮不用版本office文件處理問題,還要考慮如果文件裏面有圖片如何準確提取出來把數據正確的存儲到swf文件中。在這我們通過java代碼使用OpenOffice服務把文件轉換爲swf文件,使用FlexPaperswfTools在線預覽,從而達到用戶不需下載文件就能看到文件內容。

6.4敏感詞過濾

由於本系統收錄的敏感詞庫中包含上萬個敏感詞,系統要對用戶輸入的文件信息進行處理,檢查用戶輸入的信息是否含有敏感詞,但是這裏帶來一個效率問題,採用傳統思路,系統會對用戶輸入的一個文本數據比對上萬次,來驗證文本數據是否包含敏感詞庫的詞。顯然這是十分耗時的。NFA是非確定性的狀態機,DFA是確定性的狀態機。確定性和非確定性的最大區 別就是:從一個狀態讀入一個字符,確定性的狀態機得到一個狀態,而非確定性的狀態機得到一個狀態的集合。如果我們把NFA的起始狀態S看成一個集合{S} 的話,對於一個狀態集合S’,給定一個輸入,就可以用NFA計算出對應的狀態集合T’。因此我們在構造DFA的時候,只需要把起始狀態對應到S’,並且找 到所有可能在NFA同時出現的狀態集合,把這些集合都轉換成DFA的一個狀態,那麼任務就完成了。因爲NFA的狀態是有限的,所以NFA所有狀態的集合的 冪集的元素個數也是有限的,因此使用這個方法構造DFA是完全可能的。

6.5網站高併發

一臺tomcat服務器最大能支持的穩定併發數在100120之間,因爲本系統是面向互聯網用戶的,所以在同一時刻本系統面對的併發數遠遠大於120,當實際併發數大於tomcat服務器的支持數量後,會導致服務器因爲壓力過大而無法及時處理其他請求,甚至導致服務器宕機。考慮到高併發訪問的情況,本系統使用Nginx服務器的負載均衡技術構建一個由多臺服務器組成的服務器集羣,將來自客戶端的併發訪問請求分發到多臺服務器上處理,避免單一服務器出現負載壓力過大的情況。

爲了保證當任意一臺或多臺服務器宕機,Nginx服務器將請求提交給集羣中其他任意一臺可用服務器能夠正確處理處理,本系統需要設置每一臺服務器不保存請求的狀態,這樣所有的服務器完全對等,服務器就可以成功處理其他服務器之前處理的請求了。

6.6服務器集羣下狀態共享

集羣中所有的應用服務器都是無狀態的,但是在業務上系統總是有狀態的,因爲系統需要記錄用戶當前的登錄狀態來確定用戶是否可以執行接下來的操作。web應用中將這些多次請求使用的上下文對象稱作會話(session),單機情況下,session可由部署在服務器上的web容器管理。在使用負載均衡的集羣環境中,請求由負載均衡服務器分發到集羣上任意一臺應用服務器上,如何保證任意一臺應用服務器對每次請求依然能夠獲得正確的session是一個挑戰。

通過將一部分數據存儲在cookie中,來解決分佈式環境下session操作同步的問題。但是這樣做的弊端有很多,比如cookie的安全性,cookie存儲數據的大小的限制。

本系統的解決方案是將session統一存儲在緩存集羣memcache上,這樣保證較高的讀,寫性能,再從安全性上看,利用緩存的失效機制,達到控制session有效期的的作業。

6.7高併發下磁盤讀寫速度

系統在面對高併發的情況下,大量的讀,寫請求湧向數據庫,磁盤的處理速度與內存顯然不在一個量級,爲了能提高系統對數據的讀取速度,通常將常用的數據放在內存中,這樣就避免了應用程序讀取硬盤而增加時間開銷。

memcache是一個高性能的內存對象緩存系統,爲了提高在內存中查找數據的速度,memcache在內存中維護一張巨大的HashTable,使得對數據查詢的時間複雜度降低到O(1)。內存的空間總是有限的,當內存沒有更多的空間來存儲新數據時,memcache會使用LRU算法,將最近不常訪問的數據淘汰掉,以騰出空間來存放新的數據。

6.8分佈式數據庫事務一致性

軟件系統對單個數據庫內部的多個DML操作都會組成一個局部事務,因爲這些操作不會跨越多個事務性資源,軟件系統可以直接使用底層數據庫的事務支持;但是當軟件系統的功能操作涉及對多個數據庫的修改時,就面臨多個數據庫事務的一致性問題,這些數據庫的操作要麼全部成功要麼全部不成功,這就是分佈式事務,分佈式事務處理的對象是全局事務。

使用JTA編程就可以用一種與事務管理器無關的方式來開始,提交或回滾事務,Java EE應用服務器通過java事務服務來實現事務管理器。JTA事務由java EE事務管理器負責控制,它可以保證多個數據庫更新的一致性,通過JTA即可實現全局事務控制。

6.9集羣下quartz協調處理

在集羣環境下,大家會碰到一直困擾的問題,即多個應用程序下如何用quartz協調處理自動化工作。比如現在有ABC三臺服務器同時作爲集羣服務器對外統一提供服務ABC三臺臺機器上各有一個Quarzt,他們會按照即定的時間頻率自動執行各自的任務。這樣的架構其實有點像多線程,那多線程裏就會存在“資源競爭”的問題,即可能產生髒讀,髒寫,由於三臺應用服務器裏都有Quarzt,因此會存在重複處理任務的現象。quartz的任務實例化如數據庫,基於數據庫引擎及High-Available的策略(集羣的一種策略)自動協調每個節點的quartz,當任一一節點的quartz非正常關閉或出錯時,另幾個節點的quartz會自動啓動;這樣每臺作爲集羣點的應用程序上都可以佈署quartz;無需開發人員更改原已經實現的quartz,使用Spring類反射的機制對原有程序作切面重構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章