2009-09-22 2 views
0

내 서블릿에 HTTP POST 요청이 있습니다. 서블릿의 코드가 "payload"라는 추가 처리를 검색하는 http 요청에 게시 된 양식 매개 변수가 있습니다. 페이로드의 값에 windows-1252 문자 " '"(ascii 값 146)가 포함되어 있으면 HttpServletRequest 인스턴스 메서드 getParameter ("payload")는 null을 반환합니다. 문제와 관련하여 server.log에는 아무 것도 없습니다. 우리는이 문자를 생성하는 데 사용 된 문자 인코딩이 windows-1252라고 생각합니다. 글래스 피시의 HTTP 요청을 인코딩하는 문자는 ISO-8859-1로 표시됩니다. Ascii 값 146은 ISO-8859-1의 제어 문자입니다.windows-1252 문자 146가 glassfish v2에서 서블릿에 도달하는 POST 데이터를 중지 함

누구든지이 문제를 해결할 수있는 방법에 대한 제안이 있습니까? 문제를 보여 게시물에

HTTP 요청 헤더는 다음과 같습니다

POST /dbxchange/TechAnywhere HTTP/1.1 
CONTENT_LENGTH: 13117 
Content-type: application/x-www-form-urlencoded 
Cache-Control: no-cache 
Pragma: no-cache 
User-Agent: Mozilla/4.0 (Windows Vista 6.0) Java/1.6.0_16 
Host: localhost:8080 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
Connection: keep-alive 
Content-Length: 13117 
+0

참고 : 여기 에디터 마크 업 : HTTP : // 유래 .com/editing-help – McDowell

답변

0

, 그것은 도움이 있는지 확인하기 위해 형태로 다음과 같은 속성을 넣어보십시오. 자바 스크립트 코드는 요청을 보내기 전에 페이로드의 값을 인코딩하는 URL입니다. javascript 내장 함수 escape()는 URL 인코딩을 수행하는 데 사용되었습니다. 이것은 문자를 % u2019의 비표준 인코딩 구현으로 인코딩했습니다. glassfish는 이러한 비표준 형식의 인코딩을 지원하지 않는 것처럼 보입니다.

이 수정 사용 http://en.wikipedia.org/wiki/Percent-encoding#Non-standard_implementations

했다 참조 내장 된 자바 스크립트 '에 대해 "%의 E2의 % 80 % 99"을 반환 기능에 encodeURI()

0

우리는이 문자를 생산하는 데 사용되는 문자 인코딩 창-1252라고 생각합니다.

예. 브라우저가 iso-8559-1을 사용한다고 주장 할지라도, 일반적으로 실제로는 windows-1252를 사용합니다. HTTP 요청에 글래스 피쉬 기본값을 인코딩

문자는 ISO-8859-1이 시스템의 자바 '기본 인코딩'을 디폴트되어

대부분의 가능성이있을 것으로 보인다. 응용 프로그램을 재배포 할 때 응용 프로그램이 중단되므로 원하는 작업이 거의 수행되지 않습니다.

POST 요청 본문을 읽으려면 요청 객체에서 setCharacterEncoding을 호출하여 인코딩을 수정할 수 있어야합니다. 아무도 이미 호출하여 본문을 읽지 않도록 조기에 충분히 빨리 할 수 ​​있어야합니다. getParameter와 같은 메소드. 인코딩을 "Cp1252"로 설정해보십시오. 실제로는 장기적으로 모든 것을 UTF-8로 조준해야합니다.

아쉽게도 setCharacterEncoding의 영향을받지 않는 쿼리 문자열 매개 변수를 비롯하여 모든 요청에 ​​대해 응용 프로그램이 기대하는 인코딩을 지정하는 표준 J2EE 방식은 없습니다. 각 서버에는 고유 한 방식이 있으므로 성가신 배포 문제가 발생합니다. 그러나 Glassfish의 경우 sun-web.xml에 <parameter-encoding>을 설정하십시오.

+0

나는 당신의 제안을 시도했으나 문자 인코딩이 설정되어있는 것처럼 보이더라도 같은 문제가 발생합니다. request.getCharacterEncoding()은 processRequest (HttpServletRequest 요청, HttpServletResponse 응답) 메소드의 시작 부분에 "Cp1252"를 리턴합니다. – JohnCooperNZ

1

Java는 Cp1252와 Latin-1의 차이점에 대해 신경 쓰지 않습니다. 두 인코딩 모두 유효하지 않은 바이트 시퀀스가 ​​없으므로 둘 중 하나에서 null을 얻지 못합니다. 귀하의 서버가 UTF-8을 사용하고 있고 브라우저가 Cp1252 또는 Latin1을 사용하고 있다고 생각합니다.

우리는 문제가 POST 요청을 전송하는 자바 스크립트 코드에 있음을 발견했다

<form action="..." method="post" charset="UTF-8" accept-encoding="UTF-8"...> 
+0

+1 요청의 인코딩을 맹목적으로 변경하는 것보다 나은 HTML 수정 제안 – kdgregory

관련 문제