- ベストアンサー
Servletでセキュアなダウンロードをする方法
WWWサーバに個人情報が含まれた.abcという拡張子の ファイルを、JavaServletで認証したユーザだけに ダウンロードしてもらいたいのですが、 WWWサーバのドキュメントルート配下へファイルを置くとURLを直接指定すると見えてしまいます。 URLを直接指定しても見えないディレクトリに ファイルを置き、.abcはMIME/TIPEで指定されたアプリケーションで開く又はダウンロードしてもらう といった事を行いたいのですが、イメージに近いServletのソースはどこかにあるでしょうか? また、以下の方法は実現可能で安全でしょうか? 1.ダウンロードボタンを押すと ランダムにユニークとなるファイル名で 拡張子.abcを非公開ディレクトリに作成 2.headerでContentTypeやfilenameを指定し、 ダウンロードしてもらう。 3.ダウンロードファイルをなんらかの方法で消す
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
以下のようなクラスを作成してサーブレットとして登録しておき、URLへ引数としてユーザー名とパスワードを投げてあげればできると思います。ただし動作は確認していません。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class getData extends HttpServlet { public void doPost(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException{ } public void doGet (HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException{ String ok_user = "john"; String ok_password = "pass111"; String user = (String)req.getParameter("username"); String pass = (String)req.getParameter("password"); if(!ok_user.equals(ok_user) || !pass.equals(ok_password)){ gotoError(res); return; } //abcファイルの作成処理 res.setContentType("application/x-abc"); OutputStream out = (OutputStream)res.getOutputStream(); BufferedInputStream fis = new BufferedInputStream(new FileInputStream("c:/abc.abc")); byte[] data = new byte[fis.available()]; fis.read(data,0,data.length); fis.close(); out.write(data); out.flush(); File f = new File("c:/abc.abc"); f.delete(); } private void gotoError(HttpServletResponse res)throws IOException{ res.setContentType("text/html"); ServletOutputStream out = res.getOutputStream(); out.println("<html>"); out.println("<head><title>error</title></head>"); out.println("<body>"); out.println("<h1>REJECTED YOU</h1>"); out.println("</body></html>"); out.flush(); } }
その他の回答 (1)
- chirorin200x
- ベストアンサー率57% (8/14)
.htaccessではダメなのかなぁ~?
お礼
はい。その方法は最初に思いついたのですが、今回WWWサーバがApacheでなく特殊な製品なのでプログラム認証としたかったのです。 Apacheならプログラム認証を通った時に、ApacheのBasic認証も裏で通す事ができれば公開ディレクトリにファイルがおけそうですね。
お礼
ありがとうございます。超感激です(T_T) 基本的な流れがすごく良くわかりました。 時間がなくてすぐには試せませんが、 動作次第結果をアップしたいと思います。
補足
以下をsetContentType の前に追加することで目的を達成できました(^^) res.setHeader("Content-Disposition","attachment;filename=abc.abc");