[TEEDA-359] JSPのcharsetが無視される Created: 04/Sep/07  Updated: 09/Sep/07  Resolved: 09/Sep/07

Status: Resolved
Project: Teeda
Component/s: None
Affects Version/s: None
Fix Version/s: 1.0.11

Type: Task Priority: Major
Reporter: shot Assignee: shot
Resolution: Fixed Votes: 0
Labels: None


 Description   

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となってほしいのですが。

(追記)

表題の件、原因が判明しましたのでご報告と、
再度質問があります。ご回答をよろしくお願いいたします。

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
が含まれてしまい、無限ループしてしまいました。



 Comments   
Comment by shot [ 09/Sep/07 ]

ViewHandlerImpl.storeResponseCharacterEncoding()で
DEFAULT_SUFFIX以外ではエンコーディングをSessioに格納しないようにした.

Generated at Mon Oct 14 09:55:41 JST 2019 using JIRA 7.9.2#79002-sha1:3bb15b68ecd99a30eb364c4c1a393359bcad6278.