こんにちは。

先日、本番運用しているシステムにて、システム修正したところ、全角の文字が文字化けを起こす、という障害となりました。
前日行った修正としては、log4jのログにセッション情報と利用者IDを出力するようにfilterプログラムを追加しています。

【環境】
OS:CentOS release 6.5 (Final)
tomcat:6.0.39
apache:2.2.21
java:1.7.0_45

【filterプログラム】

package util;

import java.io.IOException;
import java.util.Enumeration;

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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.NDC;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public final class NdcFilter implements Filter  {


    private static final Logger logger = LoggerFactory.getLogger(NdcFilter.class);
    private FilterConfig filterConfig = null;

    public void destroy() {
        this.filterConfig = null;
    }

    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        if (filterConfig == null) {
            return;
        }

        if (request instanceof HttpServletRequest) {
            HttpServletRequest req = (HttpServletRequest) request;

            HttpSession session = req.getSession();

            //if (session== null) {

               Enumeration e = req.getParameterNames();

               while(e.hasMoreElements()) {
                        String key = (String)e.nextElement();

                        //logger.debug(key + ":" + req.getParameter(key));

                        if ( (key.equals("loginId")) || (key.equals("U"))){

                            session.setAttribute("loginId_log4j", req.getParameter(key));
                            logger.debug((String)session.getAttribute("loginId_log4j"));
                            break;
                        }

              }
            //}
            NDC.push(req.getSession().getId() + " " + (String)session.getAttribute("loginId_log4j"));

            try {
                chain.doFilter(request, response);
            } finally {
                NDC.remove();
            }
        }
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }


}

【web.xml】(抜粋)

<filter>
    <filter-name>encodingfilter</filter-name>
    <filter-class>org.seasar.extension.filter.EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>Windows-31J</param-value>
    </init-param>
</filter>
<filter>
    <filter-name>NDCfilter</filter-name>
    <filter-class>util.NdcFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>NDCfilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>encodingfilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

文字化けの原因はおそらく「encodingfilter」の前に「NDCfilter」を設定したことで、すべてのプログラムの動作がデフォルトのエンコードとなってしまったものと考えています。
(実際に、web.xmlのfilterの順番を逆にしたら文字化けは発生しませんでした。)

そこで、いくつか質問があります。
①文字化けの原因は、私の考える通りであっていますでしょうか?
②デフォルトのエンコードは、そもそもどのように決められるのでしょうか?

①については、皆様のご意見を、②については、手掛かりとなる情報ソースなどあればご紹介いただくと幸いです。

よろしくお願いします。