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

文件下载:


  可能有人疑问:直接把文件放在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>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q1054261752

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值