【问题标题】:What is the best way to store user specific files in Wicket?在 Wicket 中存储用户特定文件的最佳方式是什么?
【发布时间】:2014-01-08 21:33:10
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: file session wicket


    【解决方案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;
    
         }
    
     }
    

    【讨论】:

    • 谢谢伯特!我将阅读给出的参考资料,看看我是否可以实现这一点。我可能会带着更多问题回来。
    【解决方案2】:

    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

    【讨论】:

    • 很好,这很好用。我按照建议重载了 onValidate() 。我也打算试试bert的建议。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多