允许用户只下载一次

时间:2015-09-21 13:54:40

标签: java sqlite jsp

一个Web应用程序,客户端是jsp,后端是JAVA,DB是简单的sqlite。 在DB中有一个表包含"文件"名为Reports,用户只能在数据库中下载每个文件一次"由于安全要求",我一直试图找到一种方法。 无论如何我可以写一个jsp代码,允许用户从DB下载一次所需的文件吗?

我不知道它是否有用,但这是用于从数据库下载的JAVA代码。

String sql = "SELECT file, filename FROM reports INNER JOIN download USING(tipid) WHERE reports.tipid = ?"+
                "AND download.ts_" + ae_num+ " = 0;";

        PreparedStatement stmt = c.prepareStatement(sql);
        String tipNum = request.getParameter("tipid");
        if (tipNum != null) {

            stmt.setString(1, tipNum);
            //stmt.setString(2, tipNum);
            ResultSet res = stmt.executeQuery();
            BufferedInputStream fileBlob = null;
            String filename = "";

            while (res.next()) {
                fileBlob = new BufferedInputStream(res.getBinaryStream("file"), DEFAULT_BUFFER_SIZE);

                filename = res.getString("filename");
            }
            if (fileBlob != null) {
                System.out.println(filename);
                response.setContentType("APPLICATION/OCTET-STREAM");
                response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

                BufferedOutputStream output = new BufferedOutputStream(response.getOutputStream(),
                        DEFAULT_BUFFER_SIZE);

                byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
                int length;
                while ((length = fileBlob.read(buffer)) > 0) {
                    output.write(buffer, 0, length);
                }

                output.close();
                fileBlob.close();
                Date now = new Date();

                sql = "UPDATE download SET ts_" + ae_num + " = " + now.getTime() + " WHERE tipid = ?;";
                System.out.println(sql);
                stmt = c.prepareStatement(sql);
                stmt.setString(1, tipNum);

                stmt.executeUpdate();
                stmt.close();

                c.commit();
                c.close();

我当前遇到的问题是,每当用户尝试下载所请求的文件以及用户是否选择打开/保存或取消时,即使取消,也会将其计为下载文件。

有什么想法吗?在JSP中使用cookie有助于实现吗?如果有,有人可以指导我吗?或者如何解决下载计数问题

1 个答案:

答案 0 :(得分:1)

如果您可以控制数据库,则可能有另一个包含user_id,file_id,download_status列的表。这样你就可以随时拥有下载文件的记录。