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

Back to archive index

tj_takehana tgens****@gmail*****
2008年 4月 15日 (火) 21:34:59 JST


どうも竹花です。

ちょっと気になったので調べてみたのですが、こちらのフォーラムに開発者Matej Knoppさんの回答(?)がありました。
http://markmail.org/message/ml7ofypidrcoia5e
要点は以下二つです。
・通常、ユーザが(Ajaxで)使うのはUTF-8
・UTF-8はよりセキュア

確かにXMLの推奨コードはUTF-8/16ですので、Ajaxは基本UTF-8でいいのかもしれません。
しかし、Ajax通信がUTF-8で行われるのがデフォルトならば、尾崎様が書いたようなフィルターもデフォルトで存在するべきなような気がします。
それか、最初からsetResponseRequestEncodingがAjaxButtonに適用されないようにするとか。
意見すべきなのか、解決策があるのか…

確認のため、簡易AjaxButtonページをつくりAjax通信時のログを見てみたのですが、尾崎様のおっしゃるとおり、ページの文字コードに関わらずパラメータはすべてUTF-8にURIエンコードされていました。
(SJIS, EUC, UTF-8のみなので"すべて"とは言い切っていいものか疑問ですが。)


08/04/15 に Toshihiro Shimizu<shimi****@gmail*****> さんは書きました:
> 清水(meso)です。
>
>  なるほど!
>  Filterで処理するのはいい考えですね。
>  こちらでも上手くいくことを確認しました。
>
>  しかし、これは対処療法であって、WicketのAjaxリクエストがUTF-8以外を上手に扱えないという事実は変わりませんね。
>
>  矢野さんあたりが何とかしてくれないかなぁ(と無茶ぶりしてみる)。
>
>  08/04/15 に 尾崎智仁<ozaki****@yuroy*****> さんは書きました:
>
> > 尾崎です。
>  >
>  > アドバイスいただき、ありがとうございました。
>  >
>  > 自前で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
>  > >
>  >
>  >
>  > _______________________________________________
>  >  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 メーリングリストの案内
Back to archive index