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>
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>
可能有人疑问:直接把文件放在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>
相关文章推荐
- Spring 连接MySQL 数据库
- (非原创)JAVA学习(二)单例模式
- java 内部类如何获取外部类引用
- 导入java项目问题
- 面向对象1(2)
- heap和stack有什么区别
- 用Eclipse搭建Android开发环境并创建第一个Android项目(eclipse+android)
- 一次date_add引发的命案
- Java日期的格式String类型GMT,GST换算成日期Date种类
- Java基础(2):运算符
- Struts 2简单配置分析,让Struts 2运行起来!
- 【Java】单例模式
- (非原创)Java学习(一)抽象类和接口
- 1、Struts2和Hibernate的简单整合(带Session的管理方式)
- 面试经验之struts2里的线程安全问题
- JAVA内存学习1——玩一玩StackOverFlowError和OutOfMemoryError
- 深入理解Java的接口和抽象类
- 字节流与字符流的区别
- Java基础知识学习(四)
- spring 注入枚举类型作为参数