概要
Paas上のJBossにデプロイしたSpring Bootのアプリケーションで、あるURLのみSjisのGETリクエストが送られてくるが、日本語が文字化けする。送信されている日本語は、Shift_JISで%エンコーディングされている。Webをあさってみたところ、filterを実装して対応する例などあったがうまくいかなかった。
GETリクエストのqueryパラメタからUTF-8でリクエストを送信しなおすHTMLをブラウザに返すことで文字化けは起きない。変な処理だと思うが、記録に残す。
対応1.
サーバ側でいったんGETリクエストを受けて、queryパラメタから再度リクエストを作り直すHTML(javascript)をブラウザに返す。
onloadイベントでqueryパラメタを取り出し、ecl.jsでデコードしたのち、UTF-8でリクエストしなおす処理を実行させる。
【HTMLのJavascript部分】
<script type="text/javascript" th:src="@{/js/ecl.js}"></script>
<script type="text/javascript" th:src="@{/js/ecl_ext.js}"></script>
<script>
function convertQueryToPOSTParams(queryString) {
var params = {};
var pairs = queryString.split('&');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
var key = decodeURIComponent(pair[0]);
var value = UnescapeSJIS(pair[1]);
params[key] = value;
// フォームに設定
document.getElementById(key).value = value;
}
return params; // console.logに表示
}
function init(){
// 与えられたURLからクエリ文字列を取得
var currentURL = window.location.href;
var queryString = currentURL.split('?')[1];
// クエリ文字列をPOSTパラメータに変換
var postParams = convertQueryToPOSTParams(queryString);
console.log(postParams);
document.loginform.submit();
}
対応2
リクエストしなおすHTMLをブラウザに返すが、デコードせずにサーバに送信する。
デコードは、Apach Common Codecでサーバ側で行う。Javascriptよりなんとなく安心。
【サーバ側のデコード部分】
String value = request.getParameter("key");
String jis =null;
try {
jis = new URLCodec().decode(value,"Shift_JIS");
} catch (Exception e) {
e.printStackTrace();
}