您的位置:首页 > 编程语言 > Java开发

26.Struts2文件下载并在下载文件之前进行权限检查

2015-10-15 20:52 447 查看
文件下载:

  可能有人疑问:直接把文件放在Web应用的根路径下,即可实现文件下载。

   

   但实际上可能存在如下问题:

   1.当文件名有中文字符时,就无法下载了。

   2.直接放在Web应用的根路径下,将导致所有人可以自由下载该资源,毫无安全性可言。

   

   为了解决上面两个问题,此时就需在通过struts 2的文件下载进行控制了。

   实现文件下载的Action,关键只有一条:

   要提供一个返回值为InputStream的getter方法。

       ----该方法代表了文件下载的入口,它就是我们要让客户下载的文件的输入流。

   

   借助于struts 2的文件上载之后,

       ----所有的文件下载都要经过Struts 2的Action处理。
   因此Action就可以对是否允许用户下载进行控制。



struts.xml

<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

<constant name="struts.devMode" value="true"/>

<package name="default" extends="struts-default">
<action name="down" class="pers.zkr.action.DownAction">

<result name="login">/WEB-INF/content/login.jsp</result>
<result type="stream">
<!--该参数指定二进制流的类型 -->
<param name="contentType">${resType}</param>
<!--指定返回InputStream的方法 -->
<param name="inputName">target</param>
<!-- 指定文件 下载后,在客户端显示的文件 的名字 -->
<param name="contentDisposition">filename=${resName}</param>
<!-- 指定文件下载的缓冲的大小 -->
<param name="bufferSize">4096</param>
</result>

</action>

<action name="loginPro" class="pers.zkr.action.LoginProAction">
<result name="error">/WEB-INF/content/error.jsp</result>
<result name="success">/WEB-INF/content/downPage.jsp</result>
</action>

<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>

</package>

</struts>两个action类
<span style="font-size:10px;">package pers.zkr.action;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

//此处是一个通用的文件 下载Action,如下内容是可变的
//1.下载的目标资源(名字) 2.下载的文件类型。 3.下载的文件名(另起的名字)
public class DownAction extends ActionSupport {

private String res; //下载的资源,服务器里面文件的名字
private String resType; //下载的文件类型
private String resName; //下载的文件名,下载文件时,给文件起的名字
public String getRes() {
return res;
}
public void setRes(String res) throws IOException {
this.res = new String(res.getBytes("iso-8859-1"),"utf-8");

}
public String getResType() {
return resType;
}
public void setResType(String resType) {
this.resType = resType;
}
public String getResName() {
return resName;
}
public void setResName(String resName) {
this.resName = resName;
}

//该方法代表了文件下载的入口,它就是我们要让客户下载的文件的输入流
public InputStream getTarget() throws IOException{

//返回res资源所对应的输入流。
return new FileInputStream(ServletActionContext.
getServletContext().getRealPath("/")+res);

}

//对下载的权限进行控制
public String execute(){

Integer userId=(Integer) ActionContext.getContext()
.getSession().get("userId");

if(userId==null||userId<0){

return LOGIN;
}
return SUCCESS;
}

}</span><span style="font-size:24px;">
</span>

package pers.zkr.action;

import java.util.Random;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoginProAction extends ActionSupport {

private String name;
private String pass;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}

public String execute(){

if(name.equals("zhangsan")&&
pass.equals("123456")){

ActionContext.getContext()
.getSession().put("userId", new Random().nextInt(999999));
addActionMessage("登录成功!");
return SUCCESS;
}
addActionError("新重新登录!");
return ERROR;
}
}


downPage.jsp
<body>
<s:actionmessage/>
<!--pptx类型的文件的文件类型可以在 F:\tomcat6.0\conf\web.xml 文件中找到 -->
<a href="${pageContext.request.contextPath}/down?res=232.pptx&resType=application/vnd.openxmlformats-officedocument.presentationml.presentation&resName=struts.pptx">下载struts</a>
</body>

login.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
<h3>请先登录系统,然后下载</h3>
<s:form action="loginPro">
<s:textfield name="name" label="用户名"></s:textfield>
<s:password name="pass" label="密码"></s:password>
<s:submit value="登录"></s:submit>
</s:form>

</body>

error.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
<s:actionerror/>
</body>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: