999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Struts框架文件授權下載的實現

2017-07-10 09:54:58林海菁
科學與財富 2017年20期

林海菁

(江西工業貿易職業技術學院 南昌 330100)

摘 要:用action的stream結果類型實現文件的下載功能,從而有效地解決文件下載的權限控制問題,并根據系統的功能需求完成與下載相關的其它工作。

關鍵詞:Struts框架;授權下載;stream結果類型;文件輸入流

一、引言

網站中的文件下載是比較常用的功能,實現起來也很簡單,只要有一個關聯到相關資源文件的超鏈接就可以實現下載,不需要編寫服務器端代碼。然而這樣的下載方式雖然易于實現,卻難以實施權限控制。例如,我們希望資源對所有人可見,但只有登錄用戶可以下載,或者下載前需要扣除用戶賬戶積分。對于這樣的功能要求,常規的超鏈接直接關聯到資源文件的方式便無法滿足需求了,要考慮其它的技術手段。

在Struts框架中,一種可行的方法是用action來處理文件的下載,然后就可以通過登錄檢查攔截器來控制只有登錄用戶才能下載資源,或者在action中根據系統需要,在下載前扣除用戶賬戶積分,如果賬戶積分不足,則不能下載,等等各種需求均可實現。

二、使用action處理文件下載

使用action來處理文件的下載而不是通過超鏈接直接鏈接到資源文件,這是實現授權下載的第一步。而通過action來實現文件下載則需要用到action的一種名為stream的result結果類型。這種結果類型可以向客戶端提供文件輸入流,既可用于文件下載,也可用于動態生成文件。

使用stream結果類型需要在Action類中定義一個返回InputStream的方法,所謂InputStream就是提供給客戶端的文件輸入流,即被下載文件的入口。返回InputStream的方法可以使用默認的名稱getInputStream(),這樣可以免去在配置文件中設置參數的麻煩。在getInputStream()方法中,可以調用ServletContext提供getResourceAsStream()方法返回指定文件對應的輸入流,具體代碼如下:

public InputStream getInputStream(){

String filepath="……";//要下載的文件路徑名,可以使用自應用程序根目錄開始的絕對路徑,例如“/download/work.rar”,其中“download”是位于WebRoot文件夾中的子文件夾。

return ServletActionContext.getServletContext().getResourceAsStream(filepath);

}

這里使用變量filepath表示要下載的文件路徑名,可以通過頁面傳遞的參數間接得到要下載的文件名。例如用參數fileId得到頁面提交的要下載的文件的資源編號,再調用資源類的有關方法獲得這個資源的文件名filename,并根據所在文件夾的位置得到文件路徑名filepath,為getInputStream()方法的執行提供必要的信息。

在Action類中定義了getInputStream()方法之后,接下來我們還需要創建具體處理下載任務的action方法。本例就直接使用默認的execute( )方法,并且先不做任何控制,直接在execute( )方法中寫上“return SUCCESS;”語句,無條件下載文件。在這個Action類中,我們定義了私有變量fileId和它的setter及getter,用來接收頁面傳遞的資源編號,從而知道是要下載哪個資源。另外還定義了私有屬性filename和它的setter及getter,稍后將用它向struts.xml配置文件傳遞文件名信息。

定義action方法后,在struts.xml中配置action以及action的stream結果類型。當action返回success結果視圖時,struts框架會自動調用getInputStream()方法得到指定文件的輸入流,向客戶端提供指定文件的下載。具體配置代碼如下所示:

attachment;filename=${filename}

其中參數“contentDisposition”指定了文件下載的處理方式和保存下載文件的默認文件名。

文件下載的處理方式包括內聯(inline)和附件(attachment)兩種方式。在不設置的情況下默認是內聯方式,瀏覽器會嘗試直接顯示文件。假如是瀏覽器可以打開的文件類型,如圖像文件、文本文件等,就會直接把圖像或文件內容顯示在瀏覽器窗口。假如是瀏覽器無法打開的文件類型,如office文檔、壓縮文件等,就會出現另存為或新建下載任務對話框進行下載。附件方式則會直接出現另存為或新建下載任務對話框進行下載。

除出彈出對話框進行下載,通常我們還希望在對話框中顯示默認的文件名,這個文件名通常是要下載的文件的原文件名,因此filename=${filename}就是用來將原文件名設置為下載時的默認文件名。${filename}是取action中變量filename的值,即要下載的文件的原文件名。為了解決配置文件顯示${filename}值時出現的中文亂碼的問題,可以在getFilename()方法中返回filename的“ISO-8859-1”編碼格式的字符串。

至此,使用action下載文件的功能已實現,接下來就可以以此為依托,實現授權控制。

三、下載的授權控制

如果需要對下載權限進行控制,例如未登錄用戶不能下載,那么可以使用自定義的登錄驗證攔截器對剛才的下載action進行攔截,假如攔截器發現用戶未登錄,則顯示提示信息并跳轉到登錄頁面而不執行后續的下載action。

如果下載要扣除賬戶積分,積分不足則不能下載,那么可以在下載的action中比較當前登錄用戶的賬戶積分與下載資源所需要花費的積分,如果不足則返回其它結果視圖并給出相應的提示信息,只有在賬戶積分足夠的情況下才返回SUCCESS結果視圖執行下載。

通常,對于已支付積分下載過的資源,再次下載時可以不用二次扣費。如果這樣的話,那么可以用一個數據表記錄用戶付費下載過的資源,在下載前先查看用戶是否為這個資源付過費,如果付過就不再扣積分也不能再查積分是否足夠下載了。

還有很多其它的下載控制及相關工作,借助這個action方法,都可以實現,這里就不再贅述了。

主站蜘蛛池模板: 2018日日摸夜夜添狠狠躁| 亚洲区视频在线观看| 激情六月丁香婷婷四房播| 免费毛片网站在线观看| 免费看一级毛片波多结衣| 五月激激激综合网色播免费| 一本大道香蕉中文日本不卡高清二区| 99re这里只有国产中文精品国产精品| 91精品国产自产91精品资源| 亚洲精品成人7777在线观看| 欧美色综合网站| 四虎永久在线视频| 国内毛片视频| 日本影院一区| 2021国产v亚洲v天堂无码| 在线无码九区| 三级欧美在线| 国产欧美一区二区三区视频在线观看| 国产精品亚欧美一区二区| 欧美A级V片在线观看| 中文字幕调教一区二区视频| 日本在线国产| 亚洲AⅤ综合在线欧美一区| 亚洲国产亚洲综合在线尤物| 日本道综合一本久久久88| 成年片色大黄全免费网站久久| 91外围女在线观看| 国产一级毛片在线| 丁香婷婷久久| 亚洲91在线精品| 国产成人精品男人的天堂下载| 国产第八页| 国产成人AV男人的天堂| 午夜无码一区二区三区在线app| 国产9191精品免费观看| 免费无码一区二区| 亚洲中文无码av永久伊人| 99国产在线视频| 亚洲综合极品香蕉久久网| 亚洲AV成人一区二区三区AV| 国产欧美精品一区二区| 国产女人18水真多毛片18精品| 国产清纯在线一区二区WWW| 98超碰在线观看| 欧美在线综合视频| 99视频在线观看免费| 欧美www在线观看| 一级毛片在线播放免费观看| 丁香五月婷婷激情基地| 久久大香香蕉国产免费网站| 亚洲色图在线观看| 亚洲一级色| 精品五夜婷香蕉国产线看观看| 亚洲精品无码日韩国产不卡| 精品国产免费观看一区| 99re在线免费视频| 国产熟女一级毛片| 欧美自拍另类欧美综合图区| 午夜小视频在线| 久久亚洲精少妇毛片午夜无码| 一级看片免费视频| 久久这里只有精品66| 国产精品任我爽爆在线播放6080 | 亚洲欧美人成人让影院| 亚洲黄色网站视频| 亚洲精品无码久久久久苍井空| 国产精品自在拍首页视频8 | 国产在线一区视频| 亚洲欧洲美色一区二区三区| 强乱中文字幕在线播放不卡| 狠狠做深爱婷婷综合一区| 成人免费午夜视频| 亚洲天堂区| 欧美翘臀一区二区三区| 99这里只有精品6| 激情亚洲天堂| 成人无码区免费视频网站蜜臀| 国产高潮流白浆视频| 国产福利不卡视频| 四虎影视8848永久精品| 中文字幕人妻无码系列第三区| 欧美一区二区三区不卡免费|