J2EE環境からJakarta EE 8環境へ移行したアプリケーションにおいて、Content-Typeのcharsetの内容がShift_JISからWindows-31Jに変わってしまいました。
Interstage Application Serverのよくあるご質問を検索できます。
Interstage Application Server の技術情報はこちら
- J2EE環境からJakarta EE 8環境へ移行したアプリケーションにおいて、Content-Typeのcharsetの内容がShift_JISからWindows-31Jに変わってしまいました。
対処方法を教えてください。 -
JakartaEE8では、HTTPリクエストの取得に使う文字コードをアプリケーションで設定すると、Content-Typeヘッダーのcharset属性にも同じ文字コードが反映されるようになりました。
アプリケーションやフレームワーク等がrequest.setCharacterEncoding(String)メソッドを呼び出した場合、以降に呼び出したrequest.getContentType()メソッドで取得されるcharsetに反映されます。(Servlet仕様に明記されていない部分における実装差異です。)
例) クライアントから送信されたcharsetを上書き
1) request.getContentType()
⇒ ......,charset=Shift_JIS
2) request.setCharacterEncoding("Windows-31J")
3) request.getContentType()
⇒ ......,charset=Windows-31J
<対処方法>
HttpServletRequestWrapperをextendしたラッパークラスを実装する事でsetCharacterEncoding
前の値を取得することができます。
<実装例>
1) HttpServletRequestWrapperをextendしたラッパークラスを作成します。
例:
----------------------
public class TestServletRequest extends HttpServletRequestWrapper {
private String contentType;
public TestServletRequest( HttpServletRequest request ) {
super(request);
}
public String getContentType() {
if (this.contentType != null) {
return this.contentType;
} else {
return (super.getContentType());
}
}
public void setCharacterEncoding( String n ) throws UnsupportedEncodingException {
contentType = super.getContentType();
super.setCharacterEncoding(n);
}
}
----------------------
2) 1)で作成したラッパークラスを使用するフィルターを作成します。
例:
----------------------
public class SetCharacterEncodingFilter implements Filter {
private FilterConfig filterConfig = null;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(new TestServletRequest((HttpServletRequest)request), response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
}
}
----------------------
3) 2)のフィルターをweb.xmlに指定します。
charsetの上書きが既存のフィルターにより実施されている場合は、
当該フィルターより先に動作するよう、filter-mappingの定義順を設定します。
(filterの定義順ではありません。)
なお、WebFilterアノテーションでは順番は指定できません。web.xmlに記述する必要があります。
例:
----------------------
<filter>
<filter-name>追加するフィルター名</filter-name>
<filter-class>追加するフィルタークラス</filter-class>
</filter>
<filter>
<filter-name>既存のフィルター名</filter-name>
<filter-class>既存のフィルタークラス</filter-class>
</filter>
<filter-mapping>
<filter-name>追加するフィルター名<</filter-name>
<<url-pattern>/対象URLパターン</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>既存のフィルター名</filter-name>
<url-pattern>/対象URLパターン</url-pattern>
</filter-mapping>
----------------------
製品・サービス区分 | Interstage | ||||||
---|---|---|---|---|---|---|---|
製品・サービス情報 |
|
||||||
アンサー種別 | 構築(導入/移行) |