Java 使用Struts2一次下载一次

Java 使用Struts2一次下载一次,java,struts2,Java,Struts2,我有一个Struts2操作,它使用流来传输文件。该文件是一个可能非常大的报告。我想设置一个标志,限制用户一次只能下载一次。在我的操作中,我可以设置标志,但是当流结束时,我没有地方取消设置它 在Struts之前,我会设置标志,写入Servlet的OutputStream,然后取消设置标志。但是对于Struts,操作只是将流设置为一个变量,然后操作就完成了。Struts(在Struts.xml中设置)然后在我无法控制的地方进行发送。我认为您应该创建一个拦截器来包装此下载操作,它可以锁定/解锁当前用户

我有一个Struts2操作,它使用流来传输文件。该文件是一个可能非常大的报告。我想设置一个标志,限制用户一次只能下载一次。在我的操作中,我可以设置标志,但是当流结束时,我没有地方取消设置它


在Struts之前,我会设置标志,写入Servlet的OutputStream,然后取消设置标志。但是对于Struts,操作只是将流设置为一个变量,然后操作就完成了。Struts(在Struts.xml中设置)然后在我无法控制的地方进行发送。

我认为您应该创建一个拦截器来包装此下载操作,它可以锁定/解锁当前用户的访问。有关更多信息,请参见。

尝试在类
FileInputStream
中重写
close
函数,以下是文档,如果您使用的是另一种“inputstream”,您只需扩展它并重写
close
方法

请尝试以下代码:

public class YourInputStream extends FileInputStream {
    @Override
    public void close() throws IOException{
        super.close();
        // here unset your flag
    }
}
在你的行动课上:

inputStream = new YourInputStream(new File(path));

+1这可能是最简单的。另一种方法是创建自定义结果类型。但是如果你仔细想想,这真的不是一个好主意,因为你的操作已经完成了所有的工作,然后它会期望渲染视图(返回流),但不能这样做,或者它将不得不等待。。。总的来说,最好是快速返回,可能带有适当的错误消息。你是什么意思,该操作已经完成了工作?您可以在操作开始之前检查用户是否拥有锁,然后您根本不执行该操作。。。之后我所说的一切都与是否有人试图将解决方案实现为自定义结果类型而不是拦截器有关。