Struts2控制文件下载,可以在文件下载之前做一些操作。这里就以权限控制为例,简单实现一下Struts2的文件下载。
一、Struts2文件下载的Action配置,是提供了一个能返回InputStream流的方法,这个方法是被下载文件的入口。方法名在struts的配置文件里面配置。
DownloadAction.java
package actions; import java.io.InputStream; import java.util.Map; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction extends ActionSupport { private String inputPath; public void setInputPath(String inputPath) { this.inputPath = inputPath; } public InputStream getTargetFile() throws Exception { return ServletActionContext.getServletContext().getResourceAsStream( "/测试.jpg"); } // 下载文件前的权限控制 // 取出session中的用户名判断是否允许下载,如不允许,跳转到登录页面登录。 @Override public String execute() throws Exception { System.out.println(ServletActionContext.getServletContext() .getRealPath("/测试.jpg")); ActionContext ctx = ActionContext.getContext(); Map session = ctx.getSession(); String user = (String) session.get("user"); if (user != null && user.equals("yangys")) { return SUCCESS; } ctx.put("tip", "您还没有登录系统!"); return LOGIN; } }
二、配置下载文件的Action
配置下载文件的Action需要将result类型配置为stream,如下粗体部分,一般指定4个参数
- contentType 下载文件的类型
- inputName 下载文件的InputStream入口方法名去掉get,首字母小写
- contentDisposition 下载文件的文件名
- bufferSize 下载文件时缓冲大小,单位字节
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!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.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="yang" extends="struts-default"> <action name="login" class="actions.LoginAction"> <result name="success">index.jsp</result> </action> <action name="download" class="actions.DownloadAction"> <param name="inputPath">"/测试.jpg"</param> <result type="stream"> <param name="contentType">image/jpg</param> <param name="inputName">targetFile</param> <param name="contentDisposition">filename="测试.jpg"</param> <param name="bufferSize">4096</param> </result> <result name="login">login.jsp</result> </action> </package> </struts>
在这里,为了实现权限控制,配置了一个login的Action,是为了实现登录后可以下载文件的效果。同时,也提供了一个简单的LoginAction.java
package actions; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //登录成功后,将用户信息保存在session中 @Override public String execute() throws Exception { ActionContext ctx = ActionContext.getContext(); if (username != null && username.equals("yangys")) { ctx.getSession().put("user", username); return SUCCESS; } ctx.put("tip", "用户名或密码错误!"); return LOGIN; } }
三、两个jsp页面代码如下:
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><s:text name="文件下载测试"/></title> </head> <body> <s:form action="download"> <s:submit value="下载" /> </s:form> </body> </html>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><s:text name="loginPage" /></title> </head> <body> <s:form action="login"> <s:textfield name="username" key="user" /> <s:submit name="login"/> </s:form> </body> </html>
注:本示例是为了演示,下载文件时检查是否已经登录,如没有登录,则需要登录,登录成功后即可下载。故将下载文件表单放在了index.jsp中
时间: 2024-12-25 11:01:49