POST는 문자 집합을 준수하지 않지만 AJAX 요청은 수행하는 이유는 무엇입니까?톰캣 6
저는 utf-8 문자를 처리할 수 있는 양식을 제출해야 하는 Tomcat 기반의 애플리케이션을 가지고 있습니다.Ajax를 통해 제출하면 utf-8의 getParameter()에서 데이터가 올바르게 반환됩니다.양식 게시물을 통해 제출할 때 데이터는 iso-8859-1의 getParameter()에서 반환됩니다.
저는 fiddler를 사용했고, 요청의 유일한 차이점은 ajax 호출에서 Content-Type 헤더 끝에 charset=utf-8이 추가된다는 것입니다(예상대로 컨텐츠 유형을 명시적으로 보내기 때문입니다).
Ajax의 ContentType: "application/x-www-form-url이 인코딩되었습니다. charset=utf-8"
폼의 ContentType: "application/x-www-form-urlenced"
설정은 다음과 같습니다.
ajax 게시물(문자를 올바르게 입력):
$.ajax( {
type : "POST",
url : "blah",
async : false,
contentType: "application/x-www-form-urlencoded; charset=utf-8",
data : data,
success : function(data) {
}
});
form post(iso 단위의 문자 포함)
<form id="leadform" enctype="application/x-www-form-urlencoded; charset=utf-8" method="post" accept-charset="utf-8" action="{//app/path}">
xml 선언:
<?xml version="1.0" encoding="utf-8"?>
의사 유형:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
메타 태그:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
jvm 매개 변수:
-Dfile.encoding=UTF-8
저는 또한 요청을 사용해 보았습니다.set Character Encoding")UTF-8"); 하지만 톰캣은 단순히 무시하는 것처럼 보입니다.Request Dumper 밸브를 사용하지 않습니다.
제가 읽은 바로는, POST 데이터 인코딩은 대부분 양식이 있는 페이지 인코딩에 의존합니다.제 페이지는 utf-8로 올바르게 인코딩되어 있습니다.
이 페이지의 샘플 JSP는 올바르게 작동합니다.단순히 setCharacterEncoding(")을 사용합니다.UTF-8"); 그리고 게시한 데이터를 에코합니다.http://wiki.apache.org/tomcat/FAQ/CharacterEncoding
요약하자면, 게시 요청은 페이지가 utf-8, utf-8을 지정하는 양식 매개 변수, xml 선언 또는 다른 모든 것임에도 불구하고 문자 집합을 utf-8로 보내지 않습니다.저는 이 일에 3일의 대부분을 소비했고 아이디어가 부족합니다.누가 나를 도와줄 수 있나요?
form post(iso 단위의 문자 포함)
<form id="leadform" enctype="application/x-www-form-urlencoded; charset=utf-8" method="post" accept-charset="utf-8" action="{//app/path}">
문자 집합을 지정할 필요는 없습니다.브라우저는 HTTP 응답 헤더에 지정된 문자 집합을 사용합니다.
그저.
<form id="leadform" method="post" action="{//app/path}">
충분합니다.
xml 선언:
<?xml version="1.0" encoding="utf-8"?>
상관없습니다.XML 구문 분석기에만 해당됩니다.웹 브라우저는 구문 분석하지 않습니다.text/html
이는 서버 측면에만 해당됩니다(Facelet 또는 JSPX와 같은 XML 기반 뷰 기술을 사용하는 경우 일반 JSP에서는 불필요합니다).
의사 유형:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
상관없습니다.HTML 파서에만 해당됩니다.게다가 문자 집합을 지정하지 않습니다.대신 HTTP 응답 헤더에 있는 것이 사용됩니다.이나 JSPX와 기능을 할 수 .<!DOCTYPE html>
.
메타 태그:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
상관없습니다.HTML 페이지를 로컬 디스크에서 보거나 로컬로 구문 분석하는 경우에만 관련이 있습니다.대신 HTTP 응답 헤더에 있는 것이 사용됩니다.
jvm 매개 변수:
-Dfile.encoding=UTF-8
상관없습니다.소스 파일을 구문 분석하는 것은 Sun/Oracle(!) JVM에만 관련됩니다.
사용해 본 적도 있습니다.
request.setCharacterEncoding("UTF-8");
하지만 톰캣은 그냥 무시하는 것처럼 보입니다.Request Dumper 밸브를 사용하지 않습니다.
구문 분석되지 이은요본아즉문구직분문않작경다니동합만경우은우에, 지않석되은지하출호청것이즉▁is▁this경우(▁haven▁the다작니동않▁when▁bodyi▁work합'▁request▁calledt▁will▁only).getParameter()
사전에 등).당신은 가능한 한 빨리 이것에 전화해야 합니다.Filter
여기에 완벽한 장소입니다.그렇지 않으면 무시됩니다.
제가 읽은 바로는, POST 데이터 인코딩은 대부분 양식이 있는 페이지 인코딩에 의존합니다.제 페이지는 utf-8로 올바르게 인코딩되어 있습니다.
HTTP 응답 헤더에 따라 다릅니다.
다음 세 가지 작업만 수행하면 됩니다.
다음을 JSP 맨 위에 추가합니다.
<%@page pageEncoding="UTF-8" %>
이렇게 하면 응답 인코딩이 UTF-8로 설정되고 응답 헤더가 UTF-8로 설정됩니다.
성을 합니다.
Filter
은 에서다같일합니다을에서 과 같은 일을 합니다.doFilter()
방법:if (request.getCharacterEncoding() == null) { request.setCharacterEncoding("UTF-8"); } chain.doFilter(request, response);
이렇게 하면 POST 요청 본문이 UTF-8로 처리됩니다.
변할내용을 합니다.
<Connector>
에Tomcat/conf/server.xml
다음과 같이:<Connector (...) URIEncoding="UTF-8" />
이렇게 하면 GET 쿼리 문자열이 UTF-8로 처리됩니다.
참고 항목:
- Unicode - 문자를 올바르게 만드는 방법 - Java EE 웹 개발자를 위한 실용적인 배경 정보와 자세한 솔루션이 포함되어 있습니다.
사용해 보십시오.
How do I change how POST parameters are interpreted?
POST 요청은 전송하는 매개 변수 및 값의 인코딩을 지정해야 합니다.많은 클라이언트가 명시적 인코딩을 설정하지 못하므로 기본값이 사용됩니다(ISO-8859-1).대부분의 경우 이 해석은 선호되지 않으므로 javax.servlet을 사용할 수 있습니다.요청 인코딩을 설정하는 필터입니다.이러한 필터를 작성하는 것은 사소한 일입니다.게다가 Tomcat은 이미 그러한 예제 필터와 함께 제공됩니다.
다음을 살펴보십시오.
5.x
webapps/servlets-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
webapps/jsp-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
6.x
webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
자세한 내용은 아래 URL http://wiki.apache.org/tomcat/FAQ/CharacterEncoding 을 참조하십시오.
해보셨습니까accept-charset="UTF-8"
말씀하신 대로, 데이터는 페이지 자체의 인코딩에 따라 인코딩되어야 하는데, Tomcat이 이를 무시하는 것이 이상해 보입니다.어떤 브라우저에서 이것을 시도하고 있습니까?
지정해 보셨습니까?useBodyEncodingForURL="true"
당신의conf/server.xml
HTTP 커넥터용입니까?
저는 이 게시물의 정보를 기반으로 필터를 구현했고 현재 작동하고 있습니다.하지만, 이것은 왜 페이지가 UTF-8이었음에도 불구하고, Tomcat이 그것을 해석하기 위해 사용한 문자 집합이 ISO-9951-1인 이유를 여전히 설명하지 못합니다.
언급URL : https://stackoverflow.com/questions/4392610/why-does-post-not-honor-charset-but-an-ajax-request-does-tomcat-6
'programing' 카테고리의 다른 글
도커 컨테이너가 로컬/호스트 postgres 데이터베이스에 연결할 수 있도록 허용 (0) | 2023.09.02 |
---|---|
PowerShell "string not contains" cmdlet 또는 구문이 있습니까? (0) | 2023.09.02 |
라라벨:문자열 데이터, 오른쪽 잘림: 1406 데이터가 열에 대해 너무 깁니다. (0) | 2023.09.02 |
git .gitignore 파일의 파일을 무시하는 것을 제외하고 모두 추가합니다. (0) | 2023.09.02 |
구글 recetcha에서 사용자가 확인란을 선택한 js를 확인하는 방법은 무엇입니까? (0) | 2023.09.02 |