連載
» 2011年06月10日 00時00分 公開

Tomcat 7の新機能で何ができるようになるのか?(2):Tomcat 7も対応したServlet 3.0の変更点 後編 (3/3)

[藤野圭一,NTT OSSセンタ]
前のページへ 1|2|3       

JSESSION Cookieの設定による「Session Tracking」

 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に以下のような設定を追加します。

web.xml

5COOKIEJSESSIONID/testcommenttruefalse-1

 また、web.xmlを利用せずにプログラムでセッションコンフィグを変更するには、以下のSessionCookieConfigのAPIを利用します。

  • public void setDomain(String domain)
  • public void setHttpOnly(booleanhttpOnly)
  • public void setMaxAge(intmaxAge)
  • public void setName(String name)
  • public void setPath(String path)
  • public void setSecure(booleansecure)
  • public void setComment(String comment)

 JSESSION Cookieのコンフィグレーションを行うServletContextListenerのサンプルです。

SessionTrackingListener

@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です。

upload_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マッピングでを追加する必要があります。今回は、アノテーションを利用します。

UploadServlet

@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やを定義していない場合でも、マルチパートデータを扱えます(参考:Apache Tomcat 7 Configuration Reference (7.0.14) - The Context Container)。

次回は、Servlet 3.0以外のTomcat 7の新機能

 今回はTomcat7の紹介としてServlet 3.0のうち、「Asynchronous processing(非同期処理)」「セキュリティ」「Session Tracking」「マルチパート対応」を紹介しました。第1回目と今回の第2回目でServlet 3.0の紹介は簡単な紹介になりましたが、終了になります。

 次回は、Tomcat 7のServlet 3.0仕様のアップデート以外の変更点であるTomcat独自の新機能について紹介する予定です。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。