【发布时间】:2014-01-08 21:33:10
【问题描述】:
我正在创建一个用户特定的文件。该文件基本上是一个结果 csv,它是使用用户下载或不下载的选项创建的。当用户离开页面或结束他们的会话时,我希望能够删除此文件。处理这个问题的最佳方法是什么?
目前我正在使用 Java 的 File 类。
谢谢!
【问题讨论】:
我正在创建一个用户特定的文件。该文件基本上是一个结果 csv,它是使用用户下载或不下载的选项创建的。当用户离开页面或结束他们的会话时,我希望能够删除此文件。处理这个问题的最佳方法是什么?
目前我正在使用 Java 的 File 类。
谢谢!
【问题讨论】:
您不必首先编写文件。即时创建内容并将其流式传输回客户端。 Wicket 在包org.apache.wicket.request.resource 中有一些类来帮助解决这个问题。
作为起点,看看Wicket 6 resource management 和Wicket 1.5 Mounting resources
你基本上是在 WicketApplication.init() 中挂载一个资源:
mountResource("somePath/${param1}/${param2}", new SomeResourceReference());
比SomeResourceReference:
public class SomeResourceReference extends ResourceReference {
@Override
public IResource getResource() {
return new SomeResource();
}
}
最后在 SomeResource 中:
public class SomeResource extends AbstractResource {
@Override
public AbstractResource.ResourceResponse
newResourceResponse(Attributes attributes) {
// get the parameters
PageParameters parameters = attributes.getParameters();
final String param1 = parameters.get("param1").toStringObject();
AbstractResource.ResourceResponse response
= new AbstractResource.ResourceResponse();
response.setContentType("application/CSV");
response.setCacheDuration(Duration.NONE);
response.setCacheScope(WebResponse.CacheScope.PRIVATE);
response.setContentDisposition(ContentDisposition.INLINE);
response.setWriteCallback(new AbstractResource.WriteCallback() {
@Override
public void writeData(final Attributes attributes) throws IOException {
// create your data here
attributes.getResponse().write(dataAsString);
}
});
return response;
}
}
【讨论】:
Wicket 不控制销毁会话。这是您正在使用的 servlet 容器的问题。
如果你想在 Wicket 中创建一个文件并在会话被破坏或用户想要注销时删除该文件,它有两个部分:
用户注销(在 Wikcet 中) 在 WebSession (Wicket) 中存储文件路径或文件引用 覆盖你的 WebSession 或 AutheticatedWebSession 的方法 invalidate(),见http://ci.apache.org/projects/wicket/apidocs/6.x/org/apache/wicket/protocol/http/WebSession.html#invalidate%28%29
会话被破坏 将文件路径或文件引用存储到容器会话中,并编写您的侦听器并将其添加到您的 servlet 上下文(例如,使用 web.xml 文件的 tomcat)。 见http://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSessionListener.html
【讨论】: