[Seasar-user:10384] Re: [Teeda]JSPのcharsetが無視される

Shinpei Ohtani [E-MAIL ADDRESS DELETED]
2007年 9月 7日 (金) 10:20:36 JST


大谷です.

思い出すのに時間がかかりましたが、
以下の点についてです.

>■質問内容
>上記の現象をなんと回避したいのですがよい方法はないでしょうか。
>6のurl-patternでajaxを除外できればと考えましたが、記述の仕方が
>判りませんでした。
>ちなみにurl-patternを*.jspとすると、HttpServletRequest.getPathInfoの結果にfaces
>が含まれてしまい、無限ループしてしまいました。

基本的に/facesか*.jsfにするのが素のJSFの慣例というか標準的な方法です.
*.jspにしてしまうと、TeedaとWebコンテナで同じリクエストをdispatchし続けてしまうので
そのような挙動になると思います.おそらく他のJSF実装でもそうなります.
そのため/facesを使わない場合は、*.jsfなどにする方法が一般的にとられます.

で、本題の下記なんですが、

> ViewHandlerImpl.renderViewにおいて、html/jsp以外のアクセスの場合に
> storeResponseCharacterEncodingを呼ばないという対策ではまずいでしょうか。
> お忙しいとは思いますがご検討よろしくお願いします。

storeResponseCharacterEncodingが悪さをしている点は
確認しました.こちらは確かにJSFでDEFAULT_SUFFIXに指定されている
リソース以外を元にエンコーディングを決める部分は良くないですね.修正しておきます.
よろしくお願いします.

07/09/07 に [E-MAIL ADDRESS DELETED]<[E-MAIL ADDRESS DELETED]>
さんは書きました:
> お世話になります。田口です。
>
> レスポンスのエンコーディングが意図せず変わってしまう件ですが、
> 下記方法でも再現させることができます。
>
> teeda-jsp-exampleのhello.jspに以下を追加する
>
>   <img src="hoge.gif">
>
> hoge.gifをhello.jspと同じフォルダーに配置する。
>
> hello.jspを表示させて、ブラウザでエンコードを確認すると
> UTF-8となっていると思いますが、同一セッションでの
> それ以降のレスポンスはすべてISO-8859-1となります。
>
> 上記もajaxの場合と同様にimgをGETするURLがfacesを含んでいるために
> 起きている現象ですが、JSFのJSPのなかでイメージなどを相対パスで
> 指定するとどうしても発生してしまいます。
> 絶対パスでURLにfacesを含まないように統一すれば問題ありませんが
> あまり好ましい仕様ではない様に思います。
>
> htmlテンプレート使用している場合はhtml以外のアクセスがFaces Servlet
> で処理されることはないため問題ないのですが、JSPの場合は上記のような
> ケースで問題となります。
>
> ViewHandlerImpl.renderViewにおいて、html/jsp以外のアクセスの場合に
> storeResponseCharacterEncodingを呼ばないという対策ではまずいでしょうか。
> お忙しいとは思いますがご検討よろしくお願いします。
>
>
> >大谷です.
> >
> >> 米林さんの
> >> >Kumu.Ajax.URL = '/example/teeda.ajax';
> >> によって、/faces/は入らなくなりました。
> >> ありがとうございました。
> >>
> >> しかし、そもそも、
> >> なぜ、charsetを置き換えるんでしょうか?
> >> なにか理由でもあるんでしょうか。
> >
> >置き換えているのではなく、毎回設定しているだけです.
> >
> >問題となっているのはそこではなく、
> >Ajax(というよりもencodeURIComponent())が基本的にUTF-8しか
> >扱えないにもかかわらず、JSF側(こちらはWindows-31j)のアクセスと
> >混じってしまっているのが問題です.
> >きちんとアクセスされるべきServletにアクセスが行き届けば
> >基本的には混じることのないアクセスなので、それで問題ないと思います.
> >
> >07/09/06 に [E-MAIL ADDRESS DELETED]<[E-MAIL ADDRESS DELETED]>
> >さんは書きました:
> >> お世話になります。田口です。
> >>
> >> 米林さんの
> >> >Kumu.Ajax.URL = '/example/teeda.ajax';
> >> によって、/faces/は入らなくなりました。
> >> ありがとうございました。
> >>
> >> しかし、そもそも、
> >> なぜ、charsetを置き換えるんでしょうか?
> >> なにか理由でもあるんでしょうか。
> >>
> >> 以上です。
> >>
> >> >米林です。
> >> >
> >> >> >teeda-jsp-exampleで再現できるケースが作れそうであれば、
> >> >> >作成してもらえるとどんなケースかがすぐにわかると思います.
> >> >> とのことですので、
> >> >> teeda-jsp-example内にある、
> >> >> autocomplete.htmlの拡張子を当方の環境に合わせ、
> >> >> autocomplete.jspとし、
> >> >> JSFなので、URLに/faces/をつけてアクセスし実行すると、
> >> >> http://www.example.com/example/faces/ajax/teeda.ajax
> >> >> のような感じで、/faces/が入ってしまいます。
> >> >
> >> >田口さんに試して頂きたいのですが
> >> >ajax呼び出しする際に、以下を試して頂けますか?
> >> >
> >> >Kumu.Ajax.URL = '/example/teeda.ajax';
> >> >
> >> >上記を設定してから、ajaxを実行して下さい。
> >> >
> >> >よろしくお願いします。
> >> >
> >> >
> >> >----- Original Message -----
> >> >From: <[E-MAIL ADDRESS DELETED]>
> >> >Sent: Thursday, September 06, 2007 8:13 PM
> >> >
> >> >> お世話になります。田口です。
> >> >>
> >> >> >teeda-jsp-exampleで再現できるケースが作れそうであれば、
> >> >> >作成してもらえるとどんなケースかがすぐにわかると思います.
> >> >> とのことですので、
> >> >> teeda-jsp-example内にある、
> >> >> autocomplete.htmlの拡張子を当方の環境に合わせ、
> >> >> autocomplete.jspとし、
> >> >> JSFなので、URLに/faces/をつけてアクセスし実行すると、
> >> >> http://www.example.com/example/faces/ajax/teeda.ajax
> >> >> のような感じで、/faces/が入ってしまいます。
> >> >>
> >> >> ご確認ください。
> >> >>
> >> >>
> >> >> >大谷です.
> >> >> >
> >> >> >まず、こちらの認識とずれている点があります.
> >> >> >TeedaAjaxはデフォルトではhttp://www.example.com/example/teeda.ajaxのような
> >> >> >URLでアクセスされます.そのため、/faces/などが入ることは無いと思います.
> >> >> >また、原則としてTeedaAjaxではUTF-8前提になっていますが、
> >> >> >URLがかぶることがないので、JSPの方に影響は与えないはずです.
> >> >> >このあたりの事実関係をもう少し調べてみてもらえないでしょうか?
> >> >> >
> >> >> >teeda-jsp-exampleで再現できるケースが作れそうであれば、
> >> >> >作成してもらえるとどんなケースかがすぐにわかると思います.
> >> >> >宜しくお願いします.
> >> >> >
> >> >> >07/09/04 に Shinpei Ohtani<[E-MAIL ADDRESS DELETED]> さんは書きました:
> >> >> >> 大谷です.
> >> >> >>
> >> >> >> https://www.seasar.org/issues/browse/TEEDA-359
> >> >> >>
> >> >> >> として課題としてあげておきました.
> >> >> >> 後ほど調査してみます.取り急ぎ.
> >> >> >>
> >> >> >> 07/09/03 に Shinpei Ohtani<[E-MAIL ADDRESS DELETED]> さんは書きました:
> >> >> >> > 大谷です.
> >> >> >> >
> >> >> >> > 下記の件ですが、ちょっと時間が今取れないので
> >> >> >> > 後日改めて調べてみます.
> >> >> >> > すいませんが、宜しくお願いします.
> >> >> >> >
> >> >> >> > 07/09/03 に [E-MAIL ADDRESS DELETED]<[E-MAIL ADDRESS DELETED]>
> >> >> >> > さんは書きました:
> >> >> >> > > お世話になります。田口です。
> >> >> >> > >
> >> >> >> > > 表題の件、原因が判明しましたのでご報告と、
> >> >> >> > > 再度質問があります。ご回答をよろしくお願いいたします。
> >> >> >> > >
> >> >> >> > > 1.レスポンスがUTF-8となった原因
> >> >> >> > > JSPでは@pageでWindows-31Jを明示的に指定しているが
> >> >> >> > > viewタグの処理の中でresponse.setContentTypeしているため
> >> >> >> > > JSPの指定が無視されている。
> >> >> >> > >
> >> >> >> > > 2.viewタグの処理でUTF-8がsetContentTypeされた原因
> >> >> >> > > viewTagでは、リクエストからgetCharacterEncodingを
> >> >> >> > > 取得し、setContentTypeで設定している。
> >> >> >> > >
> >> >> >> > > 3.リクエストのCharacterEncodingがUTF-8となった原因
> >> >> >> > > フィルターの処理でCharacterEncodingを"Windows-31J"と
> >> >> >> > > 設定しているが、
> >> >ServletExternalContextUtil.setCharacterEncoding(ServletRequest)
> >> >> >> > > でUTF-8に上書きされている
> >> >> >> > >
> >> >> >> > > 4.ServletExternalContextUtilでUTF-8が設定された原因
> >> >> >> > > ServletExternalContextUtil.setCharacterEncodingでは下記のように動作して
> >> >いる
> >> >> >> > >
> >> >> >> > > getEncodingFromContentType ==> null
> >> >> >> > > getEncodingFromSession ==> UTF-8
> >> >> >> > >
> >> >> >> > > 5.getEncodingFromSession がUTF-8となった原因
> >> >> >> > > 直前のajaxのリクエストが
> >> >> >> > > FacesServlet -> AjaxServlet(フォワード)
> >> >> >> > > で処理されていてFacesServletの
> >> >> >> > > ViewHandlerImpl.storeResponseCharacterEncoding(ExternalContext)
> >> >> >> > > のなかでUTF-8が設定されている
> >> >> >> > >
> >> >> >> > > 6.ajaxのリクエストがFacesServletで処理される原因
> >> >> >> > > teedaのJSPの中でajax(teeda-ajax)を利用しており、ajaxのリクエストURL中に
> >> >> >> > > facesが含まれるため、web.xmlの
> >> >> >> > >         <servlet-mapping>
> >> >> >> > >                 <servlet-name>Faces Servlet</servlet-name>
> >> >> >> > >                 <url-pattern>/faces/*</url-pattern>
> >> >> >> > >         </servlet-mapping>
> >> >> >> > > にマッチしたため。
> >> >> >> > >
> >> >> >> > > ■質問内容
> >> >> >> > > 上記の現象をなんと回避したいのですがよい方法はないでしょうか。
> >> >> >> > > 6のurl-patternでajaxを除外できればと考えましたが、記述の仕方が
> >> >> >> > > 判りませんでした。
> >> >> >> > > ちなみにurl-patternを*.jspとすると、HttpServletRequest.getPathInfoの結
> >> >果にfaces
> >> >> >> > > が含まれてしまい、無限ループしてしまいました。
> >> >> >> > >
> >> >> >> > > 以上、よろしくお願いいたします。
> >> >> >> > >
> >> >> >> > >
> >> >> >> > > >お世話になります。田口です。
> >> >> >> > > >
> >> >> >> > > >JSPでTeeda-ajax-1.0.7、Teeda-core-1.0.7を使い開発しています。
> >> >> >> > > >
> >> >> >> > > >JSPのPageディレクティブに
> >> >> >> > > ><@ page language="java" contentType="text/html; charset=Windows-31J"
> >> >%>
> >> >> >> > > >と指定していますが、
> >> >> >> > > >Ajax通信後に表示されるページの
> >> >> >> > > >レスポンスデータを見ると、
> >> >> >> > > >UTF-8となっています。
> >> >> >> > > >(以降もUTF-8のまま)
> >> >> >> > > >
> >> >> >> > > >Ajax通信後には、contentTypeのcharsetに従い、
> >> >> >> > > >Windows-31Jとなってほしいのですが。
> >> >> >> > > >
> >> >> >> > > >原因と対策方法をご教示ください。
> >> >> >> > > >以上、よろしくお願いいたします。
> >> >> >> > > >
> >> >> >> > > _______________________________________________
> >> >> >> > > Seasar-user mailing list
> >> >> >> > > [E-MAIL ADDRESS DELETED]
> >> >> >> > > https://ml.seasar.org/mailman/listinfo/seasar-user
> >> >> >> > >
> >> >> >> >
> >> >> >> >
> >> >> >> > --
> >> >> >> > =============================
> >> >> >> > Shinpei Ohtani
> >> >> >> > [E-MAIL ADDRESS DELETED]
> >> >> >> > =============================
> >> >> >> >
> >> >> >>
> >> >> >>
> >> >> >> --
> >> >> >> =============================
> >> >> >> Shinpei Ohtani
> >> >> >> [E-MAIL ADDRESS DELETED]
> >> >> >> =============================
> >> >> >>
> >> >> >
> >> >> >
> >> >> >--
> >> >> >=============================
> >> >> >Shinpei Ohtani
> >> >> >[E-MAIL ADDRESS DELETED]
> >> >> >=============================
> >> >
> >> >---
> >> >米林 正明
> >> >[E-MAIL ADDRESS DELETED]
> >> >
> >> >_______________________________________________
> >> >Seasar-user mailing list
> >> >[E-MAIL ADDRESS DELETED]
> >> >https://ml.seasar.org/mailman/listinfo/seasar-user
> >> >
> >> _______________________________________________
> >> Seasar-user mailing list
> >> [E-MAIL ADDRESS DELETED]
> >> https://ml.seasar.org/mailman/listinfo/seasar-user
> >>
> >
> >
> >--
> >=============================
> >Shinpei Ohtani
> >[E-MAIL ADDRESS DELETED]
> >=============================
> >_______________________________________________
> >Seasar-user mailing list
> >[E-MAIL ADDRESS DELETED]
> >https://ml.seasar.org/mailman/listinfo/seasar-user
> >
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>


-- 
=============================
Shinpei Ohtani
[E-MAIL ADDRESS DELETED]
=============================



Seasar-user メーリングリストの案内