質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    16160questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Tomcat

    628questions

    TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

  • TERASOLUNA

    10questions

    TERASOLUNA(テラソルナ)はNTTデータの独自フレームワークです。 比較的大規模なシステム開発における 開発手順・フレームワーク・サポートなどの製品群により構成されています。

terasolunaのSetCharacterEncodingFilterのmoreパラメタについて

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 1,401

yuji38kwmt

score 427

 背景

terasoluna serverでWeb開発をしています。

エンコーディングフィルタを設定するため、WEB-INF/web.xmlに下記を設定しました。
terasolunaの機能説明書 (AL008-02 エンコードフィルタ機能)を、参照しました。

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>jp.terasoluna.fw.ex.web.thin.SetCharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>Windows-31J</param-value>
    </init-param>
    <init-param>
        <param-name>more</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>ignore</param-name>
        <param-value>false</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 質問1

jp.terasoluna.fw.ex.web.thin.SetCharacterEncodingFilterの、moreパラメタの意味を教えてください。

JavaDocを見ましたが、「フィルタの複数回処理フラグ」という情報までしか分かりませんでした。

http://terasoluna.osdn.jp/javadoc/server-web_2.0.5.2/teralib-filter-1.0.2/jp/terasoluna/fw/ex/web/thin/SetCharacterEncodingFilter.html

jp.terasoluna.fw.ex.web.thin.SetCharacterEncodingFilterも掲載します。

/*
 * Copyright (c) 2012 NTT DATA Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package jp.terasoluna.fw.ex.web.thin;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * <p>リクエストパラメータのエンコーディング設定を行う。</p>
 * <p>
 * 使用方法
 * </p>
 * <p>
 * クライアントのリクエストに自動的に文字エンコード指定を行いたい場合、
 * Webアプリケーション設定ファイル(web.xml)で
 * 専用のサーブレットフィルタ(SetCharacterEncodingFilter)を登録する。<br>
 * その際、初期化パラメータとして、
 * リクエストの文字エンコード種別・フィルタの複数回処理フラグ・フィルター無効化フラグを指定する。<br>
 * 文字エンコード種別の値が未入力、無効な値の場合はwarnレベルのログを出力し、エンコーディング設定は行われない。<br>
 * 以下は、リクエストに自動的に文字エンコード指定を行う場合のencodingの指定例である。<br>
 * <br>
 * Webアプリケーション設定ファイル(web.xml)<br>
 * <code>
 * &lt;filter&gt;<br>
 * &nbsp;&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br>
 * &nbsp;&nbsp;&lt;filter-class&gt;<br>
 * &nbsp;&nbsp;&nbsp;jp.terasoluna.fw.ex.web.thin.SetCharacterEncodingFilter<br>
 * &nbsp;&nbsp;&lt;/filter-class&gt;<br>
 * &nbsp;&nbsp;&lt;init-param&gt;<br>
 * &nbsp;&nbsp;&nbsp;&lt;param-name&gt;encoding&lt;/param-name&gt;<br>
 * &nbsp;&nbsp;&nbsp;&lt;param-value&gt;Windows-31J&lt;/param-value&gt;<br>
 * &nbsp;&nbsp;&lt;/init-param&gt;<br>
 * &nbsp;&lt;init-param&gt;<br>
 * &nbsp;&nbsp;&lt;param-name&gt;more&lt;/param-name&gt;<br>
 * &nbsp;&nbsp;&lt;param-value&gt;false&lt;/param-value&gt;<br>
 * &nbsp;&lt;/init-param&gt;<br>
 * &nbsp;&lt;init-param&gt;<br>
 * &nbsp;&nbsp;&lt;param-name&gt;ignore&lt;/param-name&gt;<br>
 * &nbsp;&nbsp;&lt;param-value&gt;false&lt;/param-value&gt;<br>
 * &nbsp;&lt;/init-param&gt;<br>
 * &lt;/filter&gt;<br>
 * <br>
 * &lt;filter-mapping&gt;<br>
 * &nbsp;&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br>
 * &nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br>
 * &lt;/filter-mapping&gt;<br>
 * </code>
 */
public class SetCharacterEncodingFilter implements Filter {

    /**
     * ログクラス。
     */
    private static Log log = LogFactory
            .getLog(SetCharacterEncodingFilter.class);

    /**
     * フィルタ処理済みフラグ。
     */
    private static final String THRU_FILTER_KEY = "THRU_FILTER_ENCODING";

    /**
     * フィルタの複数回処理フラグ。
     */
    private boolean moreFlag = false;

    /**
     * エンコーディング。
     */
    private String encoding = null;

    /**
     * このフィルターを無効化するフラグ。
     */
    private boolean ignoreFlag = false;

    /**
     * 初期化処理。
     * 
     * @param filterConfig
     *            フィルター設定
     * 
     * @throws ServletException
     *                例外
     */
    public void init(FilterConfig filterConfig) throws ServletException {

        // Log
        if (log.isDebugEnabled()) {
            log.debug("init() called.");
        }

        String encode = filterConfig.getInitParameter("encoding");

        try {
            if (!Charset.isSupported(encode)) {
                log.warn(encode + " is unsupported encoding.");
            } else {
                this.encoding = encode;
            }
        } catch (IllegalCharsetNameException e) {
            log.warn("The format of encoding is not correct.");
        } catch (IllegalArgumentException e) {
            log.warn("encoding can not be null.");
        }

        if (log.isDebugEnabled()) {
            log.debug("this.encoding = " + this.encoding);
        }

        String ignoreValue = filterConfig.getInitParameter("ignore");
        if (ignoreValue != null) {
            this.ignoreFlag = this.createFlag(ignoreValue);
        }

        String moreValue = filterConfig.getInitParameter("more");
        if (moreValue != null) {
            this.moreFlag = this.createFlag(moreValue);
        }
    }

    /**
     * フィルター処理。
     * 
     * <p>
     * リクエストパラメータを指定されたエンコーディングに設定する。
     * </p>
     * 
     * @param request
     *            リクエスト
     * @param response
     *            レスポンス
     * @param chain
     *            フィルターチェーン
     * 
     * @throws IOException
     *                例外
     * @throws ServletException
     *                例外
     */
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, 
            ServletException {

        if (!this.moreFlag && request.getAttribute(THRU_FILTER_KEY) != null) {
            chain.doFilter(request, response);
            return;
        }

        if (!ignoreFlag && encoding != null) {
            // Log
            if (log.isDebugEnabled()) {
                log.debug("set encoding(" + encoding + ") to request.");
            }
            request.setCharacterEncoding(encoding);
        }

        // 処理済フラグを格納
        request.setAttribute(THRU_FILTER_KEY, THRU_FILTER_KEY);

        chain.doFilter(request, response);
    }

    /**
     * 終了時処理。
     */
    public void destroy() {
        this.encoding = null;
    }

    /**
     * 文字列より、フラグを生成する。
     * 
     * @param value
     *            対象文字列。
     * @return 生成されたフラグ。
     */
    private boolean createFlag(String value) {
        if ("true".equalsIgnoreCase(value)) {
            return true;
        } else if ("yes".equalsIgnoreCase(value)) {
            return true;
        }
        return false;
    }
}

 質問2

Tomcatにも、エンコーディングフィルタorg.apache.catalina.filters.SetCharacterEncodingFilterがあります。
これと、tomcatのエンコーディングフィルタの違いを教えてください。

公式サイト: https://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Set_Character_Encoding_Filter

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    16160questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Tomcat

    628questions

    TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

  • TERASOLUNA

    10questions

    TERASOLUNA(テラソルナ)はNTTデータの独自フレームワークです。 比較的大規模なシステム開発における 開発手順・フレームワーク・サポートなどの製品群により構成されています。