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