2012-07-17 2 views
2

클라이언트는 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} 

킥하지 않는 바인딩

내 질문은 :

  1. 는 IE8에서 데이터를 바인딩하는 봄을 얻을하는 것이 가능/9 CORS 요청을 사용합니다. 그것이 그렇다면 - 내가 뭘 잘못하고 있니?
  2. 그렇지 않은 경우 - 왜 그리고 다른 옵션을 사용해야합니까?

는 UPDATE : - 나는 HttpServletRequestWrapper에 우선하지 않았다

추가 조사에 나는 봄이 request.getParameterMap()를 사용하여 WebRequestDatabinder의 요청 데이터를 결합하는 것을 발견했다.

다음

는 포스트 FORM 데이터는 서블릿 컨테이너 ( http://java.boot.by/wcd-guide/ch01s02.html)에 의해 설정된 매개 변수에 채워집니다 전에 충족되어야하는 조건은 다음과 같습니다

  1. 요청이 HTTP 또는 HTTPS 요청입니다.
  2. HTTP 메서드는 POST입니다.
  3. 콘텐츠 유형은 application/x-www-form-urlencoded입니다.
  4. 서블릿은 요청 개체에서 'getParameter'패밀리 중 하나를 처음 호출했습니다.

서블릿 컨테이너는 content-Type을 text/plain으로보고 있기 때문에 요청 본문을 매개 변수 맵으로 구문 분석하지 않습니다. Spring은 빈 매개 변수 맵을 찾고 따라서 데이터를 바인드하지 않습니다.

+0

이 질문을하지 않아야합니다. rentacoder 또는 oDesk로 이동 하시겠습니까? – c69

+0

기존 솔루션/시도에 대한 참조 또는 가능한 해결책에 대한 포인터를 얻으려고합니다. 모든 코드가 아닐지라도. Google/SO 검색에서이 문제에 대한 참조를 찾지 못했습니다. – user1533032

답변

0

스프링이 솔루션을 제공하지 않는다고 생각합니다.liens of this gist을 따라 필터를 만들 수 있습니다.

+0

링크의 필터처럼 이미 필터가 있습니다. CORS 요청이 없다면 모든 브라우저에서 AT ALL이 작동하지 않았을 것입니다. – user1533032

관련 문제