天天看点

下载前的授权控制

通过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 ,如需转载请自行联系原作者