zoukankan      html  css  js  c++  java
  • Strut2文件下载

    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中

  • 相关阅读:
    Python+paramiko实现绕过跳板机免密登录服务端
    ssh-keygen生成公钥私钥
    连接MySQL报 unblock with 'mysqladmin flush-hosts' 问题解决
    查询MySQL连接数
    Git常用操作命令
    cmd命令、Python脚本生成任意大小任意格式文件
    颜色渐变实现
    4月简单总结
    大佬经历读后感
    Echarts实践-实现3D地球
  • 原文地址:https://www.cnblogs.com/yoran-yang/p/5196654.html
Copyright © 2011-2022 走看看