[Wicket-ja-user 73] Re: AjaxButtonでsubmitしたFormのencodeについて

Back to archive index

尾崎智仁 ozaki****@yuroy*****
2008年 4月 15日 (火) 19:23:33 JST


尾崎です。

アドバイスいただき、ありがとうございました。

自前でgetByte("utf-8")とする方法も考えたのですが、
Filterを追加することで対応しました。

ようは、AjaxButtonなどWicket.Ajax.Call.submitForm()で送信されるPOSTデータのみ、
utf-8でエンコードできればよく、それ以外はShift_JISでOKと考え、
WicketFilterの前に以下のようなFilterを追加すると、うまく行きました。

Ajaxでの送信時には、リクエストヘッダーにWicket-Ajax : trueと設定されることを
利用して、Ajaxでの送信か判定しています。

///////以下FilterのdoFilter()/////
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpServletRequest = (HttpServletRequest)request;
        String ajaxHeader = httpServletRequest.getHeader("Wicket-Ajax");

        if (ajaxHeader != null && ajaxHeader.length() > 0 &&
ajaxHeader.equalsIgnoreCase("true"))
        {
            httpServletRequest.setCharacterEncoding("utf-8");
            request = new HttpServletRequestWrapper(httpServletRequest){

                /* (非 Javadoc)
                 * @see
javax.servlet.ServletRequestWrapper#setCharacterEncoding(java.lang.String)
                 */
                @Override
                public void setCharacterEncoding(String enc)
                        throws UnsupportedEncodingException {
                    // 何もしない
                }

            };
        }

        chain.doFilter(request, response);
    }

08/04/15 に Toshihiro Shimizu <shimi****@gmail*****> さんは書きました:
>
> 清水(meso)です。
>
> なるほど、ブラウザ判定でShift_JISなんですね。それはかなり茨の道ですね。
> おっしゃるとおり、今はUTF-8で作っとくのがベストだと思います。
> とはいえ、Shift_JISでもなんとかならんかなと、いじってみました。
>
> AjaxButtonのonSubmitメソッドを
>
>             @Override
>             protected void onSubmit(AjaxRequestTarget target, Form form) {
>                 try {
>                     byte[] bytes =
> textField.getModelObjectAsString().getBytes(
>                             "Shift_JIS");
>                     result.setModelObject(new String(bytes, "UTF-8"));
>                     target.addComponent(result);
>                 } catch (UnsupportedEncodingException e) {
>                     // TODO Auto-generated catch block
>                     e.printStackTrace();
>                 }
>             }
>
> こんな感じにしたら、「ああああ」と入力すれば「ああああ」と文字化けせずに表示できました。
> が、「あいうえおかきくけこ」を入力したら「あい????おかきくけこ」と表示されました・・・。
> でもこれってWicketのせいじゃないだろうから、なんとかしようがありそうな気も。
>
> 08/04/15 に 尾崎智仁<helme****@gmail*****> さんは書きました:
>
> > 尾崎です。
> >
> > 言葉足らずですみません・・・。
> >
> > > HTMLをShift_JISで作成し、HTMLのHEAD内で
> > > <meta http-equiv="content-type" content="text/html; charset=sjis"/>
> > > と指定し、Applicationクラスのinitメソッド内で
> > >
> > getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");
> > > と指定したところ、確かに文字化けすることを確認しました。
> > 上記のとおりです。
> >
> > もう少し詳細に書くと、
> > テンプレート・ファイルを文字コードShift_JISで、XHTMLで作成しました。
> >  XML宣言にもencoding="Shift_JIS"を指定しています。
> > さらに、
> >
> getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");と指定しています。
> >
> > この状態だと、ブラウザに出力されるHTMLはShift_JISとなります。
> > (ブラウザ側もShift_JISで解釈しています。)
> >
> > で、submitを行うと、フォームのデータをutf-8でencodeした
> > POSTデータが、サーバに送信されます。
> >
> >  wicket-ajax.jsの370行目で行われているencodeURIComponent(text);で、
> > POSTデータはutf-8にされているようです。
> > (encodeURIComponent でエンコードされたデータは、
> > クライアントのキャラクタセットにかかわらず、utf-8 になります)
> >
> >
> しかし、サーバ側ではgetRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");と指定しているため、
> > Wicket側でHttpServletRequest.setCharacterEncoding("Shift_JIS")を設定し、
> > 結果POSTデータをShift_JISとしてエンコードしようとして文字化けとなっていると思われます。
> >
> > これって、Wicketのバグなんでしょうか?
> >
> > とりあえず、getRequestCycleSettings().setResponseRequestEncoding("utf-8");で
> > 対応しましたが、ちょっと気持ち悪い感じです。
> > まぁ、いまは全部utf-8で作っとけってことなんですかね。
> >
> > 08/04/15 に Toshihiro Shimizu <shimi****@gmail*****> さんは書きました:
> > > 清水(meso)です。
> > >
> > > HTMLをShift_JISで作成し、HTMLのHEAD内で
> > > <meta http-equiv="content-type" content="text/html; charset=sjis"/>
> > > と指定し、Applicationクラスのinitメソッド内で
> > >
> > getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");
> > > と指定したところ、確かに文字化けすることを確認しました。
> > >
> > > しかし、そのページのソースをブラウザから表示してみると、
> > > <meta http-equiv="content-type" content="text/html; charset=sjis"/>
> > > は削除されており、ページのエンコードもUTF-8だと判定されていました。
> > >
> > > なので、
> > >
> > getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");
> > > を
> > >
> > getRequestCycleSettings().setResponseRequestEncoding("UTF-8");
> > > にすると、文字化けが解消されました。
> > >
> > >
> >
> 「HTMLをShit_JISに」するというのが、ブラウザでのエンコード判定もShit_JISになっていることを意味しているのか分からなかったので、もしかしたら的外れな返答かもしれませんが、よかったら試してみてください。
> > >
> > > 08/04/14 に 尾崎智仁<ozaki****@yuroy*****> さんは書きました:
> > >
> > > > はじめまして。尾崎と申します。
> > > >
> > > > HTMLをShift_JISにして、AjaxButtonでsubmitすると、
> > > > Form内のテキストフィールド内の文字を問答無用でutf-8で
> > > > encodeして送信しているようです。
> > > >
> > > >
> >
> サーバ側では、getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");と
> > > > 指定しているため、Shift_JISと解釈して文字化けが発生します。
> > > >
> > > > どうも、wicket-ajax.jsの370行目で
> > > > return encodeURIComponent(text);
> > > > としている部分が問題のようです。
> > > >
> > > > このような現象の回避方法を、どなたかご存じないでしょうか?
> > > > (そもそも全部utf-8で作ればいいんですけど・・・。)
> > > >
> > > >
> > >
> > > > _______________________________________________
> > > >  Wicket-ja-user mailing list
> > > >  Wicke****@lists*****
> > > >
> > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
> > > >
> > > >
> > >
> > > _______________________________________________
> > > Wicket-ja-user mailing list
> > > Wicke****@lists*****
> > >
> > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
> > >
> >
> >
> > _______________________________________________
> >  Wicket-ja-user mailing list
> >  Wicke****@lists*****
> > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
> >
> >
>
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
Descargar 


Wicket-ja-user メーリングリストの案内
Back to archive index