環境によるHTTP応答の差
(ReturnStatusCodeで調べる)
|
さてこれらのステータスヘッダ行をサーブレットが指定したら、エンジンやブラウザがどう対応するであろうか?各自、次のサーブレットで試してください。
- エンジンの相違(WebSpere, Tomcat 3.x, Tomcat 4.x …)及びその動作環境(スタンドアロンかあるいはどのWebサーバに乗っているか)
- ブラウザの相違(IEかNetscapeかあるいはブラウザホンかまたHTTP/1.1サポートの有無)
- sendErrorで返すかsetStatusで返すか
によって異なる結果が得られる場合があるので、実際の運用に使う前にあらかじめよく確認することが重要である。このサーブレットはそのためのツールとして有効であろう。
package basic_servlets; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; /** *
^の記述を挿入してください。 * 作成日
: (01/06/15 15:18:12) *
@author: */ public class ReturnStatusCode extends
javax.servlet.http.HttpServlet { /** *
Process incoming HTTP GET requests */ public void
doGet(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException,
java.io.IOException { performTask(request, response); } /** *
Process incoming HTTP POST requests */ public void
doPost(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException,
java.io.IOException { performTask(request, response); } /** * このサーブレットの情報の文字列を返す */ public String getServletInfo() { return "ReurnStatusCode, Version 1.0 by
Terry"; } /** * 要求パラメタにステータスコードの文字列があれば、それに対応したステータスコードの応答を返す * クエリ文字列が正しくなければエラーコード400を返す */ public void
performTask(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) throws ServletException,
IOException{ try { String codeNames[] =
{"SC_CONTINUE","SC_SWITCHING_PROTOCOLS","SC_OK","SC_CREATED",
"SC_ACCEPTED","SC_NON_AUTHORITATIVE_INFORMATION","SC_NO_CONTENT",
"SC_RESET_CONTENT","SC_PARTIAL_CONTENT","SC_MULTIPLE_CHOICES",
"SC_MOVED_PERMANENTLY","SC_MOVED_TEMPORARILY","SC_SEE_OTHER","SC_NOT_MODIFIED",
"SC_USE_PROXY","SC_BAD_REQUEST","SC_UNAUTHORIZED","SC_PAYMENT_REQUIRED",
"SC_FORBIDDEN","SC_NOT_FOUND","SC_METHOD_NOT_ALLOWED","SC_NOT_ACCEPTABLE", "SC_PROXY_AUTHENTICATION_REQUIRED","SC_REQUEST_TIMEOUT","SC_CONFLICT","SC_GONE",
"SC_LENGTH_REQUIRED","SC_PRECONDITION_FAILED","SC_REQUEST_ENTITY_TOO_LARGE",
"SC_REQUEST_URI_TOO_LONG","SC_UNSUPPORTED_MEDIA_TYPE", "SC_REQUESTED_RANGE_NOT_SATISFIABLE","SC_EXPECTATION_FAILED",
"SC_INTERNAL_SERVER_ERROR",
"SC_NOT_IMPLEMENTED","SC_BAD_GATEWAY",
"SC_SERVICE_UNAVAILABLE","SC_GATEWAY_TIMEOUT","SC_VERSION_NOT_SUPPORTED"}; int codeValues[] = {HttpServletResponse.SC_CONTINUE,
HttpServletResponse.SC_SWITCHING_PROTOCOLS,
HttpServletResponse.SC_OK,HttpServletResponse.SC_CREATED,
HttpServletResponse.SC_ACCEPTED,
HttpServletResponse.SC_NON_AUTHORITATIVE_INFORMATION,
HttpServletResponse.SC_NO_CONTENT,
HttpServletResponse.SC_RESET_CONTENT,
HttpServletResponse.SC_PARTIAL_CONTENT,
HttpServletResponse.SC_MULTIPLE_CHOICES,
HttpServletResponse.SC_MOVED_PERMANENTLY,
HttpServletResponse.SC_MOVED_TEMPORARILY,
HttpServletResponse.SC_SEE_OTHER,
HttpServletResponse.SC_NOT_MODIFIED,
HttpServletResponse.SC_USE_PROXY,
HttpServletResponse.SC_BAD_REQUEST,
HttpServletResponse.SC_UNAUTHORIZED,
HttpServletResponse.SC_PAYMENT_REQUIRED,
HttpServletResponse.SC_FORBIDDEN,
HttpServletResponse.SC_NOT_FOUND,
HttpServletResponse.SC_METHOD_NOT_ALLOWED,
HttpServletResponse.SC_NOT_ACCEPTABLE,
HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED,
HttpServletResponse.SC_REQUEST_TIMEOUT,
HttpServletResponse.SC_CONFLICT,
HttpServletResponse.SC_GONE,
HttpServletResponse.SC_LENGTH_REQUIRED,
HttpServletResponse.SC_PRECONDITION_FAILED,
HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE,
HttpServletResponse.SC_REQUEST_URI_TOO_LONG,
HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE,
HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE,
HttpServletResponse.SC_EXPECTATION_FAILED,
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, HttpServletResponse.SC_NOT_IMPLEMENTED,
HttpServletResponse.SC_BAD_GATEWAY,
HttpServletResponse.SC_SERVICE_UNAVAILABLE,
HttpServletResponse.SC_GATEWAY_TIMEOUT,
HttpServletResponse.SC_HTTP_VERSION_NOT_SUPPORTED
}; String
requestParameter = request.getParameter("code"); int returnCode =
HttpServletResponse.SC_BAD_REQUEST; String returnMessage =
"コード:400 SC_BAD_REQUESTを返します"; for (int i =0; i <
codeNames.length; i++){
if (requestParameter.equals(codeNames[i])){
returnCode = codeValues[i];
returnMessage = "コード:"+ codeValues[i] + " " +
codeNames[i] + "を返します";
} }
response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out =
response.getWriter();
out.println("<HTML><BODY><BIG>");
out.println(returnMessage);
out.println("</BIG></BODY></HTML>"); response.sendError(returnCode); //sendErrorで試すときはこの行を使う //
response.setStatus(returnCode); //setStatusで試すときはこの行を使う out.flush();
//バッファ類の明示的クローズ out.close();
response.flushBuffer(); } catch(IOException theException) {
System.err.println("ReturnStatusCode error: " +
theException.getMessage()); } } } |
このコードの説明は不要であろう。自分のブラウザから以下のようにURLを入力してこのサーブレットを呼び出して、その結果を調べることができる。
http://localhost:8080/examples/servlet/ReturnStatusCode?code=SC_FORBIDDEN
(これはApache/Tomcat Test
Environmentの場合)