클라이언트는 IE8 또는 IE9를 사용하여 Spring 3.1을 사용하는 내 도메인에 CORS 요청을 작성합니다. 나는 IE8/9 CORS 요청에 대해, 단지 텍스트/일반임을 알고서버 측에서 CORS 요청을 수정하는 방법 - 스프링 바인딩 사용 가능
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}
:
@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";
}
다음과 같은 출력을 제공합니다 : 컨트롤러에있는 서버에서
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;
}
, 요청의 Content-Type 헤더에 대해 지원됩니다. (참조 : http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx) 콘텐츠 유형으로 응용 프로그램/x-www-form-urlencoded을 예상하므로 Spring이 IE8/IE9로부터 요청을 바인딩하지 않는 이유를 알고 있습니다.
들어오는 요청을 가로 채기 위해 필터를 사용했으며 모든 요청에 대해 ContentType을 "application/x-www-form-urlencoded; charset = UTF-8"로 설정했습니다 (지금 테스트 목적으로).
Modify request parameter with servlet filter에 참고로하는 것에는, I는 getContentType,로 getCharacterEncoding, getHeader, getHeaderNames 대해 getHeaders 및 방법을 대체 HttpServletRequestWrapper에서 HttpServletRequest로를 래핑하고, 필터에 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 요청을 사용합니다. 그것이 그렇다면 - 내가 뭘 잘못하고 있니?
- 그렇지 않은 경우 - 왜 그리고 다른 옵션을 사용해야합니까?
는 UPDATE : - 나는 HttpServletRequestWrapper에 우선하지 않았다
추가 조사에 나는 봄이 request.getParameterMap()를 사용하여 WebRequestDatabinder의 요청 데이터를 결합하는 것을 발견했다.
다음
는 포스트 FORM 데이터는 서블릿 컨테이너 ( http://java.boot.by/wcd-guide/ch01s02.html)에 의해 설정된 매개 변수에 채워집니다 전에 충족되어야하는 조건은 다음과 같습니다- 요청이 HTTP 또는 HTTPS 요청입니다.
- HTTP 메서드는 POST입니다.
- 콘텐츠 유형은 application/x-www-form-urlencoded입니다.
- 서블릿은 요청 개체에서 'getParameter'패밀리 중 하나를 처음 호출했습니다.
서블릿 컨테이너는 content-Type을 text/plain으로보고 있기 때문에 요청 본문을 매개 변수 맵으로 구문 분석하지 않습니다. Spring은 빈 매개 변수 맵을 찾고 따라서 데이터를 바인드하지 않습니다.
이 질문을하지 않아야합니다. rentacoder 또는 oDesk로 이동 하시겠습니까? – c69
기존 솔루션/시도에 대한 참조 또는 가능한 해결책에 대한 포인터를 얻으려고합니다. 모든 코드가 아닐지라도. Google/SO 검색에서이 문제에 대한 참조를 찾지 못했습니다. – user1533032