我正在创建一个特定于用户的文件。此文件基本上是一个结果csv,它是使用用户下载或不下载的选项创建的。当用户离开页面或结束会话时,我希望能够删除此文件。处理这个问题的最佳方法是什么?
目前我正在使用Java的File类。
谢谢!
答案 0 :(得分:1)
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
答案 1 :(得分:1)
您不必首先编写文件。动态创建内容并将其流回客户端。 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;
}
}