All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nablarch.fw.web.handler.HttpResponseUtil Maven / Gradle / Ivy

The newest version!
package nablarch.fw.web.handler;

import nablarch.fw.web.HttpResponse;
import nablarch.fw.web.servlet.ServletExecutionContext;

/**
 * HTTP の応答時に使用するユーティリティ。 
 *
 * @author Koichi Asano 
 *
 */
public final class HttpResponseUtil {

    /**
     * HTTPレスポンスコードの変換方法。
     * @author Masaya Seko
     */
    public enum StatusConvertMode {
        /** Nablarchのステータスコードを、HTTPレスポンスコード200に変換する(例外的に300系は除く)。 */
        CONVERT_ALL_TO_200,
        /** Nablarchのステータスコード400のみ、HTTPレスポンスコード200に変換する。 */
        CONVERT_ONLY_400_TO_200
    }

    /** HTTPレスポンスコードの変換方法をコンテキストから取得する際のキー。*/
    private static final String HTTP_STATUS_CONVERT_MODE_KEY = "nablarch_http_status_convert_mode";

    /**
     * 隠蔽コンストラクタ
     */
    private HttpResponseUtil() {
        
    }

    /**
     * Nablarchのステータスコードから、
     * クライアントに返すレスポンスに使用するHTTPステータスコードを選択する。
     * 
     * ステータスコードの値は以下のルールに従って決定される。
     * 
     * 

* 1. 通常の画面遷移の場合 *

* HTTPレスポンスコードの変換モード(通常は{@link HttpResponseHandler}経由で設定する)が、CONVERT_ONLY_400_TO_200の場合、 * 以下のようにステータスコードのマッピングを行う。
* このマッピングは、1.5.x以降のデフォルトのマッピングである。
* バリデーションエラー等を表すNablarchのステータスコード400番のみ、HTTPレスポンスコード200にマッピングされる。
*

     * ========================= =======================
     * Nablarchのステータスコード    HTTPレスポンスコード
     * ========================= =======================
     * 2xx                       (そのまま)
     * 3xx                       (そのまま)
     * 400                       200
     * 4xx(400以外)              (そのまま)
     * 5xx                       (そのまま)
     * ========================= =======================
     * 
* * HTTPレスポンスコードの変換モードが、CONVERT_ALL_TO_200の場合、 * 以下のようにステータスコードのマッピングを行う。
* このマッピングは、1.4.x以前と同一のマッピングである。
* *
     * ========================= =======================
     * Nablarchのステータスコード    HTTPレスポンスコード
     * ========================= =======================
     * 2xx                       200
     * 3xx                       (そのまま)
     * 4xx                       200
     * 5xx                       200
     * ========================= =======================
     * 
     * 
* 2. Ajaxクライアントからのリクエストの場合 *

* HTTPリクエストに ヘッダ X-Requested-With が設定されており、 * かつその値が、"XMLHttpRequest" に一致する場合はHTTPレスポンスオブジェクトの * ステータスコードをそのまま設定する。 *

* X-Requested-Withヘッダとは、javascriptフレームワークが XMLHttpRequestオブジェクトを * 使用してリクエストを送信する際に付与するカスタムHTTPヘッダであり、 * 主要なJavascriptフレームワークのほとんどでこれをサポートしている。 * (prototype.js, jQuery, dojo, MooTools など) *

* また、XMLHttpRequestを直接使用している場合でも、以下のサンプルの様なコードを * 追加することで、簡単に対応させることができる。 * *

     * var xhr = getXmlHttpRequest(); // XMLHttpRequestオブジェクトを生成
     * xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); // ヘッダ追加
     * 
* * @param res HttpResponse * @param ctx ServletExecutionContext * @return クライアントに返すレスポンスに使用するHTTPステータスコード */ public static int chooseResponseStatusCode(HttpResponse res, ServletExecutionContext ctx) { int statusCode; if (isAjaxRequest(ctx)) { // Ajaxリクエストの場合はステータスコードをそのままレスポンスに設定。 statusCode = res.getStatusCode(); } else { if (ctx.getRequestScopedVar(HTTP_STATUS_CONVERT_MODE_KEY) == StatusConvertMode.CONVERT_ALL_TO_200) { //1.4以前の仕様 if (res != null && 300 <= res.getStatusCode() && res.getStatusCode() <= 399) { // 3xx 系のステータスコードはそのまま返却 statusCode = res.getStatusCode(); } else { // それ以外はステータスコード200に変換 statusCode = 200; } } else { //1.5以降の仕様 if (res == null || 400 == res.getStatusCode()) { // 以下の場合は200にマッピング // ・レスポンスのオブジェクトがnull // ・400 (バリデーションエラー、改ざん検知等を表す) statusCode = 200; } else { statusCode = res.getStatusCode(); } } } return statusCode; } /** * このリクエストがXMLHttpRequestオブジェクト(いわゆるAjaxリクエスト)によるものか * どうかを判定する。 * * このメソッドでは、HTTPリクエスト中に含まれる X-Requested-With ヘッダを用いて * Ajaxリクエストの判定を行う。 * * @param ctx 実行コンテキスト * @return Ajaxリクエストであれば true を返す。 */ public static boolean isAjaxRequest(ServletExecutionContext ctx) { return "XMLHttpRequest".equals(ctx.getServletRequest().getHeader( "X-Requested-With")); } /** * NablarchのステータスコードをHTTPレスポンスコードに変換する際のモードを設定する。 * @param ctx 実行コンテキスト * @param mode 変換のモード */ public static void setStatusConvertMode(ServletExecutionContext ctx, StatusConvertMode mode) { ctx.setRequestScopedVar(HTTP_STATUS_CONVERT_MODE_KEY, mode); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy