ÀÚ¹Ù ½ºÇÁ¸µ ÀÎÄÚµù ´ë¹Ú »ðÁú °æÇè - ½ÇÀü
1. ¹®Á¦ »óȲ
¿ì¸® ¼¹ö´Â UTF-8À» »ç¿ëÇÏ°í ÀÖ¾ú´Âµ¥,
¿ÜºÎ ¾÷ü¿¡¼ EUC-KR POST ¹æ½Ä(Content-type: charset=EUC-KR; text/html)À¸·Î ÇÑ±Û ÆĶó¹ÌÅ͸¦ Àü´ÞÇÏ¿´°í, ÇѱÛÀÌ ±úÁö´Â ¿À·ù°¡ ¹ß»ý.
2. ¿À·ù È®ÀÎÀ» À§ÇÑ »ðÁú
1) »ðÁúÀÇ ½ÃÀÛ
Postman À̶ó´Â ¾îÇø®ÄÉÀ̼ÇÀ» »ç¿ëÇÏ¿© Å×½ºÆ®¸¦ ÁøÇàÇÏ¿´´Ù.
UTF-8·Î º¸³»´Ù°¡, EUC-KR·Î º¸³»°í,
tomcatÀÇ server.xmlµµ °Çµå·Á º¸°í,
½ºÇÁ¸µ web.xml¿¡¼ ÇÊÅÍ ¼³Á¤µµ º¯°æÇغ¸¾Ò´Ù.
¼ö¸¹Àº ÀÎÄÚµù Å×½ºÆ®¸¦ °ÅÃÆÀ¸³ª ¸ðµÎ ½ÇÆÐ.
±× ÀÌÀ¯´Â Postman¿¡¼ ¾î¶»°Ô ¼³Á¤Çϵç UTF-8·Î °íÁ¤µÇ¾î ¿äûÀÌ ³¯¶ó°¬±â ¶§¹®À̾ú´Ù.
2) »ðÁúÀÇ ¿¬¼Ó(EF BF BDÀÇ ÀúÁÖ)
±×·¡¼ ÀÏ´Ü Å×½ºÆ® ÅøÀ» º¯°æÇؾ߸¸ Çß°í,
°£´ÜÇÑ HTML POST FormÀ» ¾Æ·¡Ã³·³ ÀÛ¼ºÇÏ¿´´Ù.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>Sample - Hello Page</title> </head> <body> <form action="http://ÁÖ¼Ò" method="post"> <input type="text" name="name" value="µÎÄÚÄÚ"/> <button type="submit">Á¦Ãâ</button> </form> </body> </html> |
ÀÌÁ¦ Çѱ۷ΠµÈ ÆĶó¹ÌÅ͸¦ EUC-KR ÀÎÄÚµùÀ¸·Î ¼¹ö¿¡ Àü´ÞÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù.
ÇÏÁö¸¸ ¶Ç´Ù½Ã ¹®Á¦°¡ ³ªÅ¸³µ´Ù.
³ª´Â "µÎÄÚÄÚ"¸¦ Àü¼ÛÇÏ¿´´Âµ¥ °è¼ÓÇؼ ¾Æ·¡ÀÇ °ªÀÌ ³ª¿Ô´Ù.
name=%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD
¹º°¡ ½Í¾î "È«±æµ¿" , "ÀüÁöÇö" µîµî ¾Æ¹«°ªÀ̳ª ³Ö¾îºÁµµ À§ÀÇ °ªÀÌ ³ª¿Ô´Ù.
µµ´ëü EF BF BD´Â ¹«¾ùÀ̶õ¸»Àΰ¡? °á°ú´Â ¾Æ·¡¿Í °°¾Ò´Ù.
"¾î¶°ÇÑ ÀÌÀ¯·Î ¹®¼°¡ UTF-8·Î ÀúÀåµÉ ¶§ ±úÁ®¼ ��·Î º¯È¯µÅ ¹ö¸°´Ù. ��´Â UTF-8¿¡¼ EF BF BD / EF BF BD·Î ÀúÀåµÈ´Ù."
(ÀÚ¼¼ÇÑ ¼³¸íÀº https://uncyclopedia.kr/wiki/%E5%8D%A0%EC%8F%99%EC%98%99 ¸¦ ÂüÁ¶ÇÏ¸é µÈ´Ù)
ÀÏ´Ü »óȲÀ» »ìÆ캸´Ï, EUC-KR·Î ³Ñ¾î¿Â °ªÀ» UTF-8·Î º¯È¯ÇÏ´Â °úÁ¤¿¡¼ ¹ß»ýÇÑ ¿À·ù¿´´Ù.
¿À, ³ª´Â º¯È¯À» ÇÏÁö ¾Ê¾Ò´Âµ¥ µµ´ëü ¾îµð¼ º¯È¯À» ÇÏ°í ÀÖ´Ü ¸»Àΰǰ¡?
'±×·¡ ¹¹ ¼¹ö ¼³Á¤ÀÌ°ÚÁö' ½Í¾î È®ÀÎÇغ¸´Ï, ¾Æ´Ï³ª ´Ù¸¦±î ¾Æ·¡ÀÇ ¼³Á¤ÀÌ web.xml¿¡ ÀÖ¾ú´Ù.
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
(Âü°í·Î À§ÀÇ web.xml ¼³Á¤Àº POST ¹æ½Ä¸¸ Àû¿ëµÇ¸ç, GET¹æ½ÄÀÇ °æ¿ì server.xmlÀÇ connector ÀÎÄÚµù ¼³Á¤À» Á¶ÀÛÇØ¾ß ÇÑ´Ù.)
ÀÌó·³, ¸ðµç URL¿¡ ´ëÇØ UTF-8·Î ÀÎÄÚµùÀ» ÇÏ°í ÀÖ¾ú´ø °ÍÀÌ°í,
EUC-KR·Î µé¾î¿Â °ªÀÌ ¹Ù·Î UTF-8·Î ÀÎÄÚµùµÇ¸é¼ ±ÛÀÚ°¡ ±úÁö°Ô µÈ °ÍÀ̾ú´Ù.
3) URLEncoded°¡ µÇ¾îÀÖ³×? ±×°Íµµ UTF-8·Î?
ÀÌÁ¦ ³»°¡ ÇؾßÇÒ ÀÏÀº ¼¹ö ÀÎÄÚµù ÇÊÅ͸¦ EUC-KR·Î º¯°æÇÏ´Â °ÍÀÌ¿´´Ù.
¹°·Ð, ³»°¡ ÀÎÄÚµù ÇÊÅ͸¦ ¹Ù²Ù¸é ±âÁ¸ÀÇ UTF-8 ¹æ½ÄÀ» µû¸£´ø ´Ù¸¥ °Íµé¿¡¼ ¸ðµÎ ¿¡·¯°¡ ³ª±â ¶§¹®¿¡
ÀÏ´Ü Å×½ºÆ®³ª Çغ¸ÀÚ ½Í¾î ·ÎÄÿ¡¼¸¸ À§ÀÇ encoding º¯¼ö¸¦ "EUC-KR"·Î º¯°æÇÏ¿© Å×½ºÆ®Çغ¸¾Ò´Ù.
@RequestBody·Î ¹ÞÀº String name¿¡´Â "name=%EB%91%90%EC%BD%94%EC%BD%94" À̶ó´Â °ªÀÌ µé¾îÀÖ¾ú´Ù.
Àú °ªÀº µü ºÁµµ "µÎÄÚÄÚ"°¡ URLEncodedµÈ °ÍÀ̾ú±â ¶§¹®¿¡
URLDecoder.decode(name, "EUC-KR"); ·Î º¯°æÇÏ¿´´Ù.
ÀÚ ÀÌÁ¦ ÇѱÛÀÌ ³ª¿ÔÀ»±î?
¹°·Ð ³ª¿ÀÁö ¾Ê¾Ò´Ù.
¿ÖÀϱî?
Àú name µÚÀÇ URLEncodedµÈ °ªÀº UTF-8À̾ú±â ¶§¹®À̾ú´Âµ¥,
URLDecoder.decode(name, "UTF-8");¸¦ ÇÏÀÚ "µÎÄÚÄÚ"°¡ Á¤»óÃâ·Â µÊÀ» º¼ ¼ö ÀÖ¾ú´Ù.
³ªÀÇ »ý°¢Àº
a. form¿¡¼ EUC-KR·Î "µÎÄÚÄÚ" Àü¼Û
b. ¼¹ö ÇÊÅÍ¿¡¼ EUC-KR·Î µðÄÚµù
c. @RequestBody String name À¸·Î ¹ÞÀº °ªµµ euc-kr·Î URL µðÄÚµùÇϸé "µÎÄÚÄÚ" Ãâ·Â °¡´ÉÀ̾ú°í,
½ÇÁ¦´Â
c. @RequestBody String name À¸·Î ¹ÞÀº °ªÀ» utf-8·Î URL µðÄÚµùÇϸé "µÎÄÚÄÚ" Ãâ·Â °¡´ÉÀ̾ú´Ù.
±×·¸´Ù. »ç½Ç ³ª´Â @RequestBody°¡ ¹«½¼ÀÏÀ» ÇÏ´ÂÁöµµ ¸ð¸£°í »ç¿ëÇÏ°í ÀÖ¾ú´ø °ÍÀÌ´Ù.
4) HttpServletRequest.getParameter() & @RequestBody
Form¿¡¼ POST ¹æ½ÄÀ¸·Î µ¥ÀÌÅ͸¦ Àü¼ÛÇϸé ÀÚµ¿ÀûÀ¸·Î URL ÀÎÄÚµùÀÌ µÇ¾î Àü¼ÛµÈ´Ù.
(ÀÌ ¶§ÀÇ ÀÎÄÚµù ¹æ½ÄÀº ÇØ´ç Form¿¡ ÁöÁ¤µÈ content-type¿¡ ´Þ·Á ÀÖ´Ù.)
¿Ö URL ÀÎÄÚµùÀÌ µÇ´À³Ä Çϸé, ¾Æ·¡Ã³·³ '&', '=' ±âÈ£°¡ value·Î ¾²ÀÏ ¼ö Àֱ⠶§¹®ÀÌ´Ù.
corpName=A&B&corpAddr=°æ±âµµ=¼¿ï½Ã Á¦ÁÖµ¿
±×·¡¼ °á±¹
a. EUC-KR·Î ÀÎÄÚµù µÊ.
b. URLEncoding µÊ.
c. Byte·Î request Body¿¡ µé¾î°¨
ÀÌ ¼¼°¡Áö ´Ü°è¸¦ °ÅÃÄ ÆĶó¹ÌÅÍ°¡ Àü¼ÛµÈ °ÍÀÌ´Ù.
±×¸®°í ¼¹ö¿¡ ¿Í¼´Â
web.xmlÀÇ ÀÎÄÚµù ÇÊÅ͸¦ ÅëÇØ request bodyÀÇ Byte °ªÀ» ¾î¶² ÀÎÄÚµù ¹æ½ÄÀ¸·Î ÀоîµéÀÏÁö °áÁ¤ÇÏ°Ô µÈ´Ù.
request.getParameter(key) ¸Þ¼ÒµåÀÇ °æ¿ì ÀÚµ¿ÀûÀ¸·Î ÇØ´ç key¿¡ ¼ÓÇÑ value¸¦ URLµðÄÚµùÇÑ °ªÀ¸·Î ²¨³»Áֱ⠶§¹®¿¡
request.getParameter("name")À» Çϸé "µÎÄÚÄÚ"°¡ Çѹ濡 Àß ³ª¿À°Ô µÈ´Ù.
±×. ·¯. ³ª, @RequestBody·Î String ÆĶó¹ÌÅ͸¦ »ç¿ëÇÏ°Ô µÇ¸é ¸»ÀÌ ´Þ¶óÁø´Ù.
http://blog.naver.com/duco777/220565709386 ¿¡µµ ¼³¸íÀÌ Àִµ¥,
tomcatÀÇ inputStream consumed ¹®Á¦·Î ÆĶó¹ÌÅ͵éÀ» Ä«ÇÇ Ã³¸® ÇÏ¸é¼ UTF-8·Î °íÁ¤µÇ¾î ÀÎÄÚµù ó¸® µÈ´Ù.
Áï, ´Ã UTF-8·Î µðÄÚµù ÇÏ¸é µÇ´Â °ÍÀ̾ú´ø °ÍÀÌ´Ù.
ÀÌ·¸°Ô ÆòÈ·Ó°Ô ³¡³ª´Â µí Çß´Ù.
5) ¼¹ö ÇÊÅÍ Àû¿ë
¾Æ±î À§¿¡¼ Àû¿ëÇß´ø ¼¹ö ÇÊÅÍ´Â °ø¿ëÀ¸·Î UTF-8À» ¾²´ø °ÍÀ» Å×½ºÆ®¸¦ À§ÇØ ÀÓÀÇ·Î EUC-KR·Î ¹Ù²Û °ÍÀ̾ú´Ù.
Áï, url-filter¸¦ »ç¿ëÇÏ¿© ³»°¡ Àû¿ëÇÏ°íÀÚ ÇÏ´Â °÷¿¡¸¸ ´Ù¸¥ ÇÊÅ͸¦ Àû¿ëÇؾßÇÏ´Â ¹®Á¦°¡ ³²¾ÆÀÖ´Â °ÍÀÌ´Ù!!!
ÀÏ´ÜÀº ¾Æ·¡Ã³·³ µÎ °³ÀÇ ÇÊÅ͸¦ Àû¿ëÇغ¸¾Ò´Ù.
<filter> <filter-name>eucKrEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>euc-kr</param-value> </init-param> </filter> <filter-mapping> <filter-name>eucKrEncodingFilter</filter-name> <url-pattern>/test.nhn</url-pattern> </filter-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
À§¿¡´Â /test.nhnÀÇ °æ·Î·Î Á¢±ÙÇÒ °æ¿ì euc-kr·Î ÀÎÄÚµùÇÏ´Â ÇÊÅ͸¦ Ãß°¡ Àû¿ëÇÑ °æ¿ìÀÌ´Ù.
ÇÏÁö¸¸, È®ÀÎ °á°ú UTF-8·Î ÀÎÄÚµùÀÌ µÇ¾î ¾Æ·¡ÀÇ ÀúÁÖ°ªÀÌ ´Ù½Ã Çѹø µîÀåÇÏ´Â °ÍÀÌ ¾Æ´Ñ°¡??
name=%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%C8%AE
¿ÖÀÎÁö À§, ¾Æ·¡¸¦ ¹Ù²Ù¸é requestÀÇ Ä³¸¯ÅͼÂÀÌ ¹Ù²ð°Í¸¸ °°¾Æ »¡°£ÄÚµå¿Í ÆĶõÄÚµåÀÇ ¼ø¼¸¦ º¯°æÇÑ µÚ Àç½Ãµµ Çغ¸¾Ò´Ù.
¿ª½Ã, °á°ú´Â ÂüÆÐ.
ÇÊÅÍ µÎ °³ Àû¿ëÀº ¾ÈµÇ´Â °ÍÀϱî?
À̹ø¿£ CharacterEncodingFilter¸¦ È®ÀåÇÑ MyEncodingFilter¸¦ »ç¿ëÇغ¸¾Ò´Ù.
<filter> <filter-name>myEncodingFilter</filter-name> <filter-class>org.test.myEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>euc-kr</param-value> </init-param> </filter> <filter-mapping> <filter-name>myEncodingFilter</filter-name> <url-pattern>/test.nhn</url-pattern> </filter-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
°á°ú´Â.... ³î¶ø°Ôµµ Àß ³ª¿Ô´Ù. myEncodingFilter¿¡ Ưº°È÷ ´Ù¸¥ °ªÀÌ ÀÖ´Â °ÍÀº ¾Æ´Ï¿´´Âµ¥ ¸»ÀÌ´Ù.
ÇÏÁö¸¸, ±×·¡µµ ÇÊÅÍ°¡ µÎ°³ÀÖ´Â°Ç º¸±â ÈäÇϱ⠶§¹®¿¡ myEncodingFilter Çϳª¸¸À» ¼±¾ðÇØ ³õ°í
³»ºÎÀûÀ¸·Î requestÀÇ url Á¤º¸¸¦ ºñ±³Çϱâ·Î ÇÏ¿´´Ù.
public class MyEncodingFilter extends CharacterEncodingFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (request.getRequestURI().startsWith("/test.nhn")) { request.setCharacterEncoding("euc-kr"); response.setCharacterEncoding("euc-kr"); filterChain.doFilter(request, response); } else { //À§ÀÇ °æ·Î°¡ ¾Æ´Ò °æ¿ì ±âº» doFilterInternalÀ» Ÿ°Ô µÈ´Ù. super.doFilterInternal(request, response, filterChain); } } } |
¿ÜºÎ¾÷ü¿¡°Ô °¥±À¸ÔÀ¸¸ç Å« »ðÁúÀ» Çߴµ¥,
ÆÀ³»ÀÇ ÀüÀÓ´ÔÀÌ µµ¿ÍÁּż Å« ¹è¿òÀÌ µÈ ÁÁÀº °æÇèÀ̾ú´Ù.
-ÀϱâÅä ³¡-
[Ãâó] ÀÚ¹Ù ½ºÇÁ¸µ ÀÎÄÚµù ´ë¹Ú »ðÁú °æÇè|ÀÛ¼ºÀÚ µÎÄÚ