◆李智文 楊永紅
基于SHH框架的多用戶在線評(píng)判系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
◆李智文 楊永紅
(佳木斯大學(xué)信息電子技術(shù)學(xué)院 黑龍江 154007)
為了培養(yǎng)計(jì)算機(jī)專業(yè)學(xué)生在程序設(shè)計(jì)的創(chuàng)新開(kāi)發(fā)一實(shí)以及實(shí)踐動(dòng)手能力,我們基于SSH框架設(shè)計(jì)了一個(gè)多用戶在線評(píng)判系統(tǒng),致力于幫助專業(yè)學(xué)生培養(yǎng)相關(guān)的專業(yè)素養(yǎng)。該系統(tǒng)以SSH框架和B/S架構(gòu)以及利用多線程編程技術(shù)設(shè)計(jì)了一個(gè)高效、精確、穩(wěn)定的多用戶在線評(píng)判系統(tǒng)。
SSH框架;B/S架構(gòu);多用戶在線評(píng)判系統(tǒng)
為了培養(yǎng)計(jì)算機(jī)專業(yè)學(xué)生在程序設(shè)計(jì)的創(chuàng)新開(kāi)發(fā)意識(shí)以及實(shí)踐動(dòng)手等候能力,設(shè)計(jì)一個(gè)高效方便的基于B/S架構(gòu)的多用戶在線評(píng)判系統(tǒng)是十分有益的,基于相關(guān)的需求我們使用SSH框架設(shè)計(jì)了一個(gè)具有高效性和精確性的多用戶在線評(píng)判系統(tǒng)。用戶可以自主系進(jìn)行代碼提交通過(guò)系統(tǒng)的自動(dòng)編譯后進(jìn)行裁判并將結(jié)果并反饋給用戶。通過(guò)OJ可以自由組織比賽并能夠按照比賽規(guī)則進(jìn)行自動(dòng)排名。系統(tǒng)基于J2EE的多層結(jié)構(gòu),通過(guò)SSH(Struts+Spring+Hibernate)組合框架進(jìn)行設(shè)計(jì)搭建。利用多線程編程技術(shù)設(shè)計(jì)一個(gè)高效以及精確、穩(wěn)定的多用戶在線評(píng)判系統(tǒng)[1]。
該系統(tǒng)是一個(gè)基于B/S架構(gòu)進(jìn)行設(shè)計(jì)的多用戶系統(tǒng),可以為用戶提供基于Web的實(shí)時(shí)在線程序設(shè)計(jì)實(shí)驗(yàn)的平臺(tái)[2]。該系統(tǒng)主要包括五個(gè)模塊:用戶管理模塊、試題模塊、裁判模塊、比賽模塊和信息交流模塊。各個(gè)模塊之下各有其不同功能子屬模塊,如圖1所示。
在線評(píng)判系統(tǒng)工作流程為:用戶登錄評(píng)判系統(tǒng)經(jīng)過(guò)身份認(rèn)證進(jìn)入網(wǎng)站,可以進(jìn)行在線瀏覽試題庫(kù)題目,并且在本地客戶端機(jī)器進(jìn)行代碼編輯以及編譯運(yùn)行和調(diào)試,之后提交代碼至判題系統(tǒng),系統(tǒng)進(jìn)行編譯運(yùn)行檢測(cè)數(shù)據(jù)樣例,使用輸入輸出數(shù)據(jù)流進(jìn)行重定向?qū)⒂脩舸a所得結(jié)果與標(biāo)準(zhǔn)答案進(jìn)行比對(duì),將錯(cuò)誤數(shù)據(jù)反饋至網(wǎng)站用戶交互界面,并將本次代碼保存,同時(shí)記錄進(jìn)入數(shù)據(jù)庫(kù)。
該系統(tǒng)是一個(gè)多用戶在線編程以及可以組織競(jìng)賽的Web應(yīng)用,需要數(shù)據(jù)庫(kù)進(jìn)行對(duì)用戶、題目以及比賽信息的存儲(chǔ),因此要合理進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)。裁判模塊是系統(tǒng)中的核心,用戶提交的程序由裁判模塊進(jìn)行編譯,并且裁判模塊還需要完成重定向輸入輸出流,測(cè)試樣例的輸入以及結(jié)果的比對(duì)等工作。關(guān)于安全性,需要考慮代碼在服務(wù)器中運(yùn)行時(shí)用戶的代碼是否屬于惡意代碼程序,例如程序執(zhí)行關(guān)機(jī)程序以及刪除系統(tǒng)文件等,因此需要著重加強(qiáng)相關(guān)應(yīng)對(duì)的有效措施來(lái)保證系統(tǒng)的安全穩(wěn)定。
圖1 系統(tǒng)功能結(jié)構(gòu)圖
由于傳統(tǒng)的J2EE的JSP+Servlet+JavaBean結(jié)構(gòu)耦合性太高,所以本系統(tǒng)使用的是J2EE中的高級(jí)技術(shù)框架技術(shù)SSH(Struts+Spring+Hibernate)。SSH框架很好降低了各層結(jié)構(gòu)代碼之間的耦合性,使代碼變得更加易于維護(hù),同時(shí)使得代碼的可讀性和可維護(hù)性提升。我們使用Struts MVC框架作為前端,Spring框架作為業(yè)務(wù)流轉(zhuǎn),數(shù)據(jù)庫(kù)的ORM映射功能由Hibernate提供。擁有統(tǒng)一開(kāi)發(fā)平臺(tái)是SSH框架的一大優(yōu)點(diǎn),通過(guò)統(tǒng)一的開(kāi)發(fā)平臺(tái)可以大大減少應(yīng)用層相關(guān)的開(kāi)發(fā)費(fèi)用,并且也可以降低應(yīng)用程序開(kāi)發(fā)的復(fù)雜性。通過(guò)SSH集成應(yīng)用技術(shù),可以極大提升應(yīng)用部署和目錄添加的效率[3]。
Struts作為經(jīng)典的表示層MVC框架,其優(yōu)秀的設(shè)計(jì)模式在大量實(shí)踐使用中已經(jīng)充分地被證明,表示層功能由Struts與JSP和Html配合實(shí)現(xiàn)[4]。Spring框架的一大優(yōu)點(diǎn)是它是一個(gè)輕量級(jí)的容器框架,由于其控制反轉(zhuǎn)和面向切面的靈活特性,可以極大節(jié)省開(kāi)發(fā)成本和縮短時(shí)間周期[5]。Hibernate是一種輕量級(jí)的持久化技術(shù),擁有強(qiáng)大的緩存機(jī)制,針對(duì)JDBC封裝性良好,還能自動(dòng)生成POJO實(shí)體與數(shù)據(jù)訪問(wèn)類DAO。
系統(tǒng)采用B/S模式的三層架構(gòu),表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)層。表示層,即前端網(wǎng)頁(yè)用于與用戶進(jìn)行交互,例如用戶可在登錄界面進(jìn)行登錄,可以瀏覽題庫(kù)題目,提交代碼等。業(yè)務(wù)邏輯層,用于處于處理業(yè)務(wù)邏輯,例如獲取將登錄界面用戶提交的身份信息,并通過(guò)持久層獲取信息記錄,進(jìn)行身份驗(yàn)證等功能。數(shù)據(jù)層,用于存儲(chǔ)題庫(kù)的信息以及用戶數(shù)據(jù)等[6]。
我們通過(guò)Struts中的Action來(lái)提供系統(tǒng)表示層的實(shí)現(xiàn),通過(guò)ActionForm作為表單模型對(duì)用戶提交的數(shù)據(jù)進(jìn)行接收,使用ActionServlet作為控制器來(lái)實(shí)現(xiàn)對(duì)Service層各種業(yè)務(wù),視圖的轉(zhuǎn)發(fā)是由Action Forward控制,用戶的頁(yè)面調(diào)用和轉(zhuǎn)發(fā)還需要通過(guò)ActionMapping配合合作完成[7]。數(shù)據(jù)庫(kù)我們使用開(kāi)源的MySQL,同時(shí)MySQL與Apache這款Web服務(wù)器軟件有著很好的配合,可以極大提升開(kāi)發(fā)效率[8]。
數(shù)據(jù)庫(kù)的設(shè)計(jì)是十分重要的,這直接決定了系統(tǒng)對(duì)數(shù)據(jù)的訪問(wèn)效率。合理正確的設(shè)計(jì)數(shù)據(jù)庫(kù)可以有效地提升系統(tǒng)的性能。系統(tǒng)有五個(gè)模塊:用戶管理模塊、試題模塊、裁判模塊、比賽模塊和信息交流模塊,數(shù)據(jù)庫(kù)中的核心是用戶表、試題表、比賽信息表、提交記錄表。設(shè)計(jì)定義四個(gè)了實(shí)體,表與表之間屬于多對(duì)多的關(guān)系,同樣對(duì)于數(shù)據(jù)庫(kù)的查詢大部分屬于聯(lián)合查詢。
裁判模塊是整個(gè)系統(tǒng)的核心。當(dāng)系統(tǒng)監(jiān)聽(tīng)到用戶提交解題程序后,系統(tǒng)啟動(dòng)子程序編譯用戶提交的代碼。開(kāi)始將題目對(duì)應(yīng)的輸入數(shù)據(jù)文件通過(guò)重定向進(jìn)行逐個(gè)輸入,同時(shí)每得到一個(gè)結(jié)果就與標(biāo)準(zhǔn)答案文件里對(duì)應(yīng)的答案進(jìn)行比對(duì),若答案完全一致則繼續(xù)輸入數(shù)據(jù)直至結(jié)束,否則直接結(jié)束數(shù)據(jù)輸入,并將錯(cuò)誤信息與錯(cuò)誤答案返回。在程序開(kāi)始運(yùn)行時(shí)刻就開(kāi)始計(jì)時(shí)在合法的時(shí)間范圍之內(nèi)如果可以得到正確答案,并且內(nèi)存消耗也在合法限制范圍之內(nèi),那么表示程序通過(guò),給出用戶反饋Accept提示,否則就需要終止程序并反饋給用戶相應(yīng)錯(cuò)誤的提示。
當(dāng)系統(tǒng)監(jiān)聽(tīng)到多為用戶提交程序時(shí),我們相應(yīng)的為每個(gè)用戶開(kāi)啟一個(gè)子程序,并按照?qǐng)D2流程進(jìn)行判題。我們使用JAVA的多線程編程技術(shù)實(shí)現(xiàn)多用戶在線評(píng)判系統(tǒng)。裁判模塊流程圖如圖2。
圖2 裁判程序流程圖
為統(tǒng)計(jì)系統(tǒng)資源的使用情況我們定義一個(gè)類用于檢測(cè):
class ResourceUtilization{
long userstarttime;//用戶執(zhí)行程序的時(shí)間
long userendtime
long systemstarttime;//系統(tǒng)執(zhí)行程序開(kāi)始時(shí)間
long systemendtime;
long noiopage; //不需要I/O操作的頁(yè)面缺失數(shù)
long iopage; //需要I/O操作的頁(yè)面缺失數(shù)
}
Userstarttime和userendtime變量是用戶程序提交后開(kāi)始執(zhí)行程序開(kāi)始的時(shí)間和結(jié)束時(shí)間,systemstarttime和systemendstarttime是系統(tǒng)執(zhí)行程序開(kāi)始和結(jié)束的時(shí)間。noiopage和iopage指程序不需要 I/O操作和需要I/O操作時(shí)頁(yè)面的缺失數(shù),頁(yè)面缺失發(fā)生在內(nèi)核需要獲得一個(gè)內(nèi)存頁(yè)面用于進(jìn)程訪問(wèn)。借助這個(gè)類可以統(tǒng)計(jì)各個(gè)程序占用系統(tǒng)資源的情況。
執(zhí)行程序消耗時(shí)間統(tǒng)計(jì):
Alltime=(ResourceUtilization.userendtime-ResourceUtilization.Userstarttime)+(ResourceUtilization.systemendtime-ResourceUtilization. Systemstarttime)
程序占用內(nèi)存開(kāi)銷統(tǒng)計(jì):
memoryusage=sysusage.noiopage*4
對(duì)于安全性處理,用戶提交的程序在服務(wù)器上進(jìn)行測(cè)試運(yùn)行,如果代碼里有一些非法惡意代碼將會(huì)對(duì)系統(tǒng)進(jìn)行造成損害,所以我們需要對(duì)代碼進(jìn)行檢查將惡意代碼進(jìn)行屏蔽。所以我們通過(guò)對(duì)子進(jìn)程管理來(lái)控制子進(jìn)程的優(yōu)先級(jí),對(duì)子進(jìn)程對(duì)系統(tǒng)資源的訪問(wèn)權(quán)限進(jìn)行限制。同樣為了系統(tǒng)安全我們還需要對(duì)用戶權(quán)限進(jìn)行限制。
本文介紹了基于SSH框架設(shè)計(jì)搭建的多用戶在線評(píng)判系統(tǒng)。我們通過(guò)對(duì)系統(tǒng)功能上的需求進(jìn)行分析指定了相關(guān)的設(shè)計(jì)方案,介紹了系統(tǒng)的設(shè)計(jì)思路以及搭建系統(tǒng)所用到的技術(shù)環(huán)境,同時(shí)也對(duì)系統(tǒng)內(nèi)核的運(yùn)行情況以及工作流程進(jìn)行了簡(jiǎn)單介紹。對(duì)于安全性的保障也描述了實(shí)現(xiàn)思路。相信通過(guò)該系統(tǒng)可以對(duì)學(xué)生獨(dú)立思考問(wèn)題以及解決問(wèn)題的能力的提升將會(huì)有很大的幫助。該系統(tǒng)仍有一些需要處理的問(wèn)題,例如大量用戶使用所產(chǎn)生的高并發(fā)問(wèn)題以及數(shù)據(jù)量的增長(zhǎng)致使性能下降的問(wèn)題,前端交互頁(yè)面的友好性以及系統(tǒng)后續(xù)擴(kuò)展性等,這些問(wèn)題仍需要后續(xù)去進(jìn)行解決。
[1]喬少杰,楊燕,葛永明,等.基于B/S架構(gòu)的多用戶在線程序評(píng)判系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與科學(xué),2011.
[2]吳曉珊,曹旭東,王森,等.基于B/S架構(gòu)的管理系統(tǒng)軟件開(kāi)發(fā)[J].計(jì)算機(jī)測(cè)量與控制,2019,27(02):123-128.
[3]劉楠,孫國(guó)道,田賢忠.ACM在線評(píng)判系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)時(shí)代,2010(02):34-35+38.
[4]余臘生,任炬.基于SSH三層架構(gòu)的OJ系統(tǒng)研究與設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2008(26):1698-1701.
[5]陳鵬. 在線評(píng)判系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)[D].東南大學(xué),2015.
[6]劉鑫標(biāo).基于B/S架構(gòu)及Linux系統(tǒng)的ACM競(jìng)賽在線評(píng)判系統(tǒng)[J].福建電腦,2010,26(11):151-152+146.
[7]陳宇,楊成虎,莊英杰,等.基于Linux的ACM程序設(shè)計(jì)競(jìng)賽在線評(píng)判系統(tǒng)研究[J].民營(yíng)科技,2008(02):26+88.
[8]蔣社想,戴書(shū)文.基于J2EE的ACM競(jìng)賽在線評(píng)判系統(tǒng)的設(shè)計(jì)[J].安徽理工大學(xué)學(xué)報(bào)(自然科學(xué)版),2009,29(04):59-63.
網(wǎng)絡(luò)安全技術(shù)與應(yīng)用2022年5期