programing

POST는 문자 집합을 준수하지 않지만 AJAX 요청은 수행하는 이유는 무엇입니까?톰캣 6

newsource 2023. 9. 2. 08:32

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 응답 헤더에 따라 다릅니다.

다음 세 가지 작업만 수행하면 됩니다.

  1. 다음을 JSP 맨 위에 추가합니다.

    <%@page pageEncoding="UTF-8" %>
    

    이렇게 하면 응답 인코딩이 UTF-8로 설정되고 응답 헤더가 UTF-8로 설정됩니다.

  2. 성을 합니다.Filter은 에서다같일합니다을에서 과 같은 일을 합니다.doFilter()방법:

    if (request.getCharacterEncoding() == null) {
        request.setCharacterEncoding("UTF-8");
    }
    chain.doFilter(request, response);
    

    이렇게 하면 POST 요청 본문이 UTF-8로 처리됩니다.

  3. 변할내용을 합니다.<Connector>Tomcat/conf/server.xml다음과 같이:

    <Connector (...) URIEncoding="UTF-8" />
    

    이렇게 하면 GET 쿼리 문자열이 UTF-8로 처리됩니다.

참고 항목:

사용해 보십시오.

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.xmlHTTP 커넥터용입니까?

는 이 게시물의 정보를 기반으로 필터를 구현했고 현재 작동하고 있습니다.하지만, 이것은 왜 페이지가 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