-
[오류] code point [x,y]에 위치한 유니코드 문자 [한글] - 한글 인코딩 오류카테고리 없음 2024. 1. 12. 14:05
ARNING: 값이 [list.do?page=1&perPageNum=10&key=t&word=자]인 HTTP 응답 헤더 [Location](이)가 유효하지 않은 값이므로 응답에서 제거되었습니다.
java.lang.IllegalArgumentException: code point [51,088]에 위치한 유니코드 문자 [자]은(는), 0에서 255까지의 허용 범위 바깥에 있으므로 인코딩될 수 없습니다.
at org.apache.tomcat.util.buf.MessageBytes.toBytesSimple(MessageBytes.java:310)
at org.apache.tomcat.util.buf.MessageBytes.toBytes(MessageBytes.java:283)
at org.apache.coyote.http11.Http11OutputBuffer.write(Http11OutputBuffer.java:389)
at org.apache.coyote.http11.Http11OutputBuffer.sendHeader(Http11OutputBuffer.java:368)
at org.apache.coyote.http11.Http11Processor.prepareResponse(Http11Processor.java:1048)
at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:376)
at org.apache.coyote.Response.action(Response.java:209)
at org.apache.coyote.Response.sendHeaders(Response.java:437)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:291)
at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:250)
at org.apache.catalina.connector.Response.finishResponse(Response.java:439)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:371)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:833)
웬만하면 오류코드를 구글에 검색하면 해결방법이 나오는데,
이 오류코드는 인터넷에 검색해도 제대로 나오는 해결법이 없는 오류라 많이 당황했다.
톰캣 서버에서는 기본인코딩이 utf-8이 아니기 때문에 한글이 들어가는 쿼리를 request 객체로 즉시 가져올 때, 이런 오류가 발생하는 것 같다.
jsp = "redirect:list.do?page=" + request.getParameter("page")
+ "&perPageNum=" + request.getParameter("perPageNum")
+ "&key=" + request.getParameter("key")
+ "&word=" + request.getParameter("word");
break;
위 처럼 쿼리스트링에 직접적으로 서버에서 가져온 데이터를 넣는것 보다, encoding 처리 후 넣어주면 해결된다.
해결방법
1.자바에서 URLEncoder.encode(String, "형식") 메서드를 사용한다.
ex)
jsp = "redirect:list.do?page=" + request.getParameter("page")
jsp = "redirect:list.do?page=" + URLEncoder.encode(request.getParameter("page"), utf-8)
2.
jsp의 el객체에서 encodeURIComponent를 사용하면 된다.
ex) <a href ="answerForm.do?title=${vo.title}"></a>
<a href ="answerForm.do?title=${encodeURIComponent(vo.title)}"></a>
인코딩이 안되있을 때 다음과 같은 오류가 뜰 때도 있었다
java.lang.IllegalArgumentException:
요청 타겟에서 유효하지 않은 문자가 발견되었습니다.
유효한 문자들은 RFC 7230과 RFC 3986에 정의되어 있습니다.
✔ Solution
톰캣 server.xml의 Connector에
relaxedQueryChars="[]()^|""를 추가해준다