在Wicket中存储用户特定文件的最佳方法是什么?

时间:2014-01-08 21:33:11

标签: file session wicket

我正在创建一个特定于用户的文件。此文件基本上是一个结果csv,它是使用用户下载或不下载的选项创建的。当用户离开页面或结束会话时,我希望能够删除此文件。处理这个问题的最佳方法是什么?

目前我正在使用Java的File类。

谢谢!

2 个答案:

答案 0 :(得分:1)

Wicket无法控制破坏会话。这是您正在使用的servlet容器的关注点。

如果要在Wicket中创建文件并在会话销毁或用户想要注销时删除文件,它有两部分:

  1. 用户退出(在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

  2. 会话被破坏 将文件路径或文件引用存储到容器会话中并编写侦听器并将其添加到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 managementWicket 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;

     }

 }