環境によるHTTP応答の差

ReturnStatusCodeで調べる)


 

 

さてこれらのステータスヘッダ行をサーブレットが指定したら、エンジンやブラウザがどう対応するであろうか?各自、次のサーブレットで試してください。

 

-      エンジンの相違(WebSpere, Tomcat 3.x, Tomcat 4.x …)及びその動作環境(スタンドアロンかあるいはどのWebサーバに乗っているか)

-      ブラウザの相違(IENetscapeかあるいはブラウザホンかまた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の場合)

 

 

前節     目次     次節