Servlet 3.0では、JSESSION Cookieの設定が新たに定義されました。
「JSESSION Cookie」とはクライアント(Webブラウザなど)とTomcat間でセッションを維持する際に利用される、名前が「JSESSION」で値がセッションIDの特別なCookieです。
Tomcat 6でもシステムプロパティやserver.xmlの設定などで一部を設定変更できましたが、Tomcat 7では、より柔軟に標準の方法でJSESSION Cookieの設定ができるようになりました。
JSESSION Cookieを設定するにはweb.xmlを利用する方法と、javax.servlet.SessionCookieConfigを利用してプログラミングで変更する方法があります。
web.xmlでの設定方法は変更したいWebアプリケーションのweb.xmlに以下のような設定を追加します。
5COOKIEJSESSIONID/testcommenttruefalse-1
また、web.xmlを利用せずにプログラムでセッションコンフィグを変更するには、以下のSessionCookieConfigのAPIを利用します。
JSESSION Cookieのコンフィグレーションを行うServletContextListenerのサンプルです。
@WebListener()
public class SessionTrackingListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent event) {
// TODO
}
@Override
public void contextInitialized(ServletContextEvent event) {
SessionCookieConfig config = event.getServletContext().getSessionCookieConfig();
config.setName("JSSID_SAMPLE");
config.setHttpOnly(true);
config.setMaxAge(180);
}
}
このListenerではJSESSION Cookieの名前をJSSID_SAMPLEに変更し、HTTPOnlyを有効にし、JSESSION Cookieの有効期限を180秒に変更しています。
Servlet 3.0では、multipart/form-dataのリクエストを扱うAPIが追加されたため、非常に簡単に、Servlet APIだけでファイルがアップロードできます。
HttpServletRequestの以下のAPIを利用してマルチパートデータを取得します。
public Collection getParts()
public Part getPart(String name)
マルチパート対応についても、簡単なサンプルを用意しました。アップロードしたファイルを別ディレクトリに保存するサンプルです。
まずは、multipart/form-dataのリクエストを投げるJSPです。
<form method="POST" action="/rensai/upload" enctype="multipart/form-data">
<input type="file" name="fileupload"> <br>
<input type="submit" value="Submit">
</form>
次にmultipart/form-dataのリクエストを受け付けるServletです。multipart/form-dataを扱うには、Servletが@MultipartConfigでアノテートされているか、Servletマッピングで
@WebServlet(name = "UploadServlet", urlPatterns = { "/upload" })
@MultipartConfig(location="/tmp/files", maxFileSize=1000000, maxRequestSize=1000000, fileSizeThreshold=1000000)
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Part part = req.getPart("fileupload");
part.write("uploadFile");
resp.getWriter().print( "Uploaded!");
}
}
以下では、@MultipartConfigアノテーションで、アップロードファイルの保存ディレクトリ、ファイルやリクエストの最大サイズなどの属性を指定しています。
@MultipartConfig(location="/tmp/files", maxFileSize=1000000, maxRequestSize=1000000, fileSizeThreshold=1000000)
「Part part = req.getPart("fileupload");」では、「<input type="file" name="fileupload">」の「name」で指定した「fileupload」でマルチパートデータを取得します。
「part.write("uploadFile");」では、@MultipartConfigのlocationで指定したディレクトリにファイルを保存します。サンプルでは固定ファイル名になっていますが、アップロードしたファイル名と同じファイル名にしたければ、Content-Dispositionヘッダの値からfilenameを抜き出してください。
Content-Dispositionヘッダは「Part#getHeader(“Content-Disposition")」を呼び出すことで取得できます。
ちなみにServlet 3.0ではマルチパートデータを扱うには、「@MultipartConfig」でアノテートされているか、もしくはweb.xmlのServletマッピングに<multipart-config>を定義している必要があります。
Tomcatでは、上記のような厳しい制約に対して、Context#allowCasualMultipartParsing属性によって仕様の緩和を提供しています。allowCasualMultipartParsingをtrueに設定すると、@MultipartConfigや
今回はTomcat7の紹介としてServlet 3.0のうち、「Asynchronous processing(非同期処理)」「セキュリティ」「Session Tracking」「マルチパート対応」を紹介しました。第1回目と今回の第2回目でServlet 3.0の紹介は簡単な紹介になりましたが、終了になります。
次回は、Tomcat 7のServlet 3.0仕様のアップデート以外の変更点であるTomcat独自の新機能について紹介する予定です。
Copyright © ITmedia, Inc. All Rights Reserved.