クライアントは、IE8 または IE9 を使用して、Spring 3.1 を使用する私のドメインに CORS リクエストを送信します。
if ($.browser.msie && window.XDomainRequest)
{
var xdr = new XDomainRequest();
xdr.open("post", "http://example.com/corstest/testPost");
xdr.onload = function() {
var dom = new ActiveXObject("Microsoft.XMLDOM");
dom.async = false;
dom.loadXML(xdr.responseText);
$("#corsdiv").html(xdr.responseText);
};
xdr.send("param1=abc");
return false;
}
else
{
$.ajax({
url: "http://example.com/corstest/testPost",
type: "POST",
data: "param1=abc",
success: function( data ) {
$("#corsdiv").html(data);
},
});
return false;
}
サーバーで、コントローラーで:
@RequestMapping(value = "/testPost", method = RequestMethod.POST)
public @ResponseBody String testPost(@RequestParam Map<String,String> body, Model model, HttpServletRequest request)
{
logger.info("Content-type: " + request.getContentType() + ";" + request.getContentLength() + ";" + request.getParameter("param1"));
logger.info("body:" + body.toString() );
return "Success";
}
次の出力が得られます。
For IE9:
INFO : Content-type: null;10;null
INFO : body:{}
For Firefox:
INFO : Content-type: application/x-www-form-urlencoded; charset=UTF-8;10;abc
INFO : body:{param1=abc}
IE8/9 CORS リクエストの場合、リクエストの Content-Type ヘッダーでサポートされるのは text/plain のみであることは承知しています。(参照:http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx)私が理解していることから、それがSpringがリクエストをバインドしない理由ですIE8/IE9 - Content-Type として application/x-www-form-urlencoded を想定しています。
フィルターを使用して着信リクエストをインターセプトし、すべてのリクエストに対して ContentType を "application/x-www-form-urlencoded; charset=UTF-8" に設定しました (現在はテスト目的で)。
サーブレット フィルターでリクエスト パラメーターを変更する を参照して、HttpServletRequest を HttpServletRequestWrapper でラップし、getContentType、getCharacterEncoding、getHeader、getHeaderNames、および getHeaders メソッドをオーバーライドし、フィルターの chain.doFilter() メソッドに渡しました。
私が得る出力は次のとおりです。
For IE9:
INFO : Content-type application/x-www-form-urlencoded; charset=UTF-8;10;null
INFO : body:{}
For Firefox:
INFO : Content-type: application/x-www-form-urlencoded; charset=UTF-8;10;abc
INFO : body:{param1=abc}
バインディングが効かない。
私の質問は:
- このアプローチを使用して、スプリングに IE8/9 CORS リクエストからデータをバインドさせることは可能ですか? もしそうなら - 私は何を間違っていますか?
- そうでない場合-なぜ、そしてこれを機能させるために他にどのようなオプションが必要ですか?
アップデート:
さらに調査したところ、Spring が request.getParameterMap() を使用して WebRequestDatabinder の要求データをバインドしていることがわかりました。これは HttpServletRequestWrapper でオーバーライドしませんでした。
ポスト FORM データがサーブレット コンテナー ( http://java.boot.by/wcd-guide/ch01s02.html )によって設定されたパラメーターに入力される前に、次の条件を満たす必要があります。
- リクエストは HTTP または HTTPS リクエストです。
- HTTP メソッドは POST です。
- コンテンツ タイプは application/x-www-form-urlencoded です。
- サーブレットは、リクエスト オブジェクトでメソッドの「getParameter」ファミリーのいずれかの初期呼び出しを行いました。
サーブレット コンテナーは content-Type を text/plain と見なすため、要求本文をパラメーター マップに解析しません。Spring は空のパラメーター マップを検出するため、データをバインドしません。