天天看點

下載下傳前的授權控制

通過Struts 2的下載下傳支援,應用程式可以在使用者下載下傳檔案之前,先通過Action來檢查使用者是否有權下載下傳該檔案,就可以實作下載下傳前的授權控制。

下面的Action的execute方法在傳回success字元串之前,首先通過判斷session裡的user屬性是否為scott,如果使用者名通過驗證就允許下載下傳,否則直接傳回登入頁面。下面是該Action類的代碼。

程式清單:codes\04\4.4\down\WEB-INF\src\org\crazyit\app\action\AuthorityDownAction.java

public class AuthorityDownAction  

    implements Action   

{  

    private String inputPath;  

    public void setInputPath(String value)  

    {  

        inputPath = value;  

    }  

    public InputStream getTargetFile() throws Exception   

        //ServletContext提供getResourceAsStream()方法  

        //傳回指定檔案對應的輸入流   

        return ServletActionContext.getServletContext()  

            .getResourceAsStream(inputPath);  

    public String execute() throws Exception  

        //取得ActionContext執行個體  

        ActionContext ctx = ActionContext.getContext();  

        //通過ActionContext通路使用者的HttpSession  

        Map session = ctx.getSession();  

        String user = (String)session.get("user");  

        //判斷Session裡的user是否通過檢查  

        if ( user !=  null && user.equals("crazyit.org"))  

        {  

            return SUCCESS;  

        }  

        ctx.put("tip" 

            , "您還沒有登入,或者登入的使用者名不正确,請重新登入!");  

        return LOGIN;  

}  

因為上面的Action在登入校驗失敗後,将傳回一個login邏輯視圖名,是以配置該Action時還必須配置一個名為login的結果,這個結果類型就是預設結果類型。下面是配置該Action的配置片段。

程式清單:codes\04\4.4\down\WEB-INF\src\struts.xml

<action name="download2" class="org.crazyit.app.action.AuthorityDownAction">  

    <!-- 定義被下載下傳檔案的實體資源 -->  

    <param name="inputPath">\images\wjc_logo.zip</param>  

    <result name="success" type="stream">  

        <!-- 指定下載下傳檔案的檔案類型 -->  

        <param name="contentType">application/zip</param>  

        <!-- 指定由getTargetFile()方法傳回被下載下傳檔案的InputStream -->  

        <param name="inputName">targetFile</param>  

        <param name="contentDisposition">filename="wjc_logo.zip"</param>  

        <!-- 指定下載下傳檔案的緩沖大小 -->  

        <param name="bufferSize">4096</param>  

    </result>  

    <!-- 定義一個名為login的結果 -->  

     <result name="login">/WEB-INF/content/login.jsp</result>  

</action>  

上面的Action在下載下傳前先進行權限檢查,如果要下載下傳檔案的浏覽者還沒有登入,或者登入用的使用者名不是crazyit.org,Action将會傳回一個名為input的視圖名,該視圖映射到/WEB-INF/content/login.jsp頁面。如果不登入系統,試圖通過單擊超級連結來下載下傳該資源,将看到如圖4.28所示的登入頁面。

<a href="http://blog.51cto.com/attachment/201206/172256995.jpg" target="_blank"></a>

為了能看到如圖4.28所示的登入頁面,我們必須為系統編寫login.jsp頁面,該頁面就是一個簡單的登入表單頁。login.jsp頁面儲存在codes\04\4.4\down\WEB-INF\content路徑下。

通過在如圖4.28所示頁面的使用者名輸入框中輸入crazyit.org字元串,并單擊“登入”按鈕,将送出該登入請求(該請求對應的Action将完成簡單登入),一旦完成了正常登入,使用者的session裡user屬性的值為crazyit.org後,檔案下載下傳将完全正常。

本文轉自

fkJava李剛 51CTO部落格,原文連結:http://blog.51cto.com/javaligang/892859 ,如需轉載請自行聯系原作者