반응형
Cookie에 간단하게 String 데이터를 넣는데 에러가 발생했습니다.
SEVERE: Servlet.service() for servlet [springDispatcherServlet] in context with path [/gaia] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value] with root cause
java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value
at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateCookieValue(Rfc6265CookieProcessor.java:197)
at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:123)
at org.apache.catalina.connector.Response.generateCookieString(Response.java:982)
at org.apache.catalina.connector.Response.addCookie(Response.java:930)
at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:386)
at javax.servlet.http.HttpServletResponseWrapper.addCookie(HttpServletResponseWrapper.java:58)
at org.springframework.security.web.firewall.FirewalledResponse.addCookie(FirewalledResponse.java:68)
at javax.servlet.http.HttpServletResponseWrapper.addCookie(HttpServletResponseWrapper.java:58)
at javax.servlet.http.HttpServletResponseWrapper.addCookie(HttpServletResponseWrapper.java:58)
at best.gaia.project.controller.ProjectUrlMapper.projectMenuOverview(ProjectUrlMapper.java:94)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
쿠키에 invalid character [32]가 있다는 건데요,
더보기
해당 에러는 톰캣 8.5에서 새로 추가된 기본 쿠키 규칙 때문입니다. 세미콜론, 콤마, 이콜 사인, 그리고 공백은 쿠키 값으로 이용될 수 없습니다. ';' , ',', '=' , ' ' 중 하나도 쓴게 없는데 없으니 , 한글때문에 그렇다는걸 알 수 있습니다.
쿠키를 추가할 때 UTF-8로 인코딩을 먼저 해 줘야 합니다.
String proj_user_nick = dao.getProjectNickNameByMemNo(projnoMemno);
resp.addCookie(new Cookie("proj_user_nick",proj_user_nick));
이전에 쿠키에 저장하던 코드 입니다.
String proj_user_nick = dao.getProjectNickNameByMemNo(projnoMemno);
proj_user_nick = URLEncoder.encode(proj_user_nick, "utf-8");
resp.addCookie(new Cookie("proj_user_nick",proj_user_nick));
인코딩 하는 한 줄을 추가 해 주었습니다.
이제 문제없이 쿠키가 추가 되는 것을 확인 할 수 있습니다.
Chrome의 개발자 탭 에서 Application - > Cookies 를 들어가면 저장된 쿠키의 값도 확인 할 수 있습니다.
그런데 URLEncoder는 공백 문자를 + 로 인코딩 해 버리는 문제가 있습니다.
String proj_user_nick = dao.getProjectNickNameByMemNo(projnoMemno);
proj_user_nick = URLEncoder.encode(proj_user_nick, "utf-8").replaceAll("\\+", "%20");
resp.addCookie(new Cookie("proj_user_nick",proj_user_nick));
이렇게 다시 바꿔 줬습니다. 매번 URFEncoder를 쓸 때마다 replaceAll 을 쓸 수 없으니, 따로 static method로 등록 해 두고 사용해야 겠습니다.
package best.gaia.utils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
public class CookieUtil {
public static void addCookie(String cookieName, String value, HttpServletResponse resp) {
try {
value = URLEncoder.encode(value, "utf-8").replaceAll("\\+", "%20");
} catch (UnsupportedEncodingException e) {}
resp.addCookie(new Cookie(cookieName,value));
}
}
쿠키를 추가하는 static 메서드를 만들었습니다
이제 의도한 값이 나오는 것을 확인 할 수 있습니다 !
이상입니다.
반응형
'Programming > JPA ⁄ Spring' 카테고리의 다른 글
Eclipse에서 Tomcat 프로젝트 Context Path 변경하기. (0) | 2021.06.06 |
---|---|
MyBatis update 조건에 따른 동적 쿼리 작성하기 , Unable to convert type java.lang.Integer of 12 to type of java.lang.CharSequence 해결 방법 (0) | 2021.06.05 |
org.apache.ibatis.reflection.ReflectionException:There is no getter for property named 해결하기 (0) | 2021.06.03 |
특정 문자 변경하는 Filter 만들기 (0) | 2021.06.02 |
Eclipse java 코드 변경시 톰캣 자동 재시작 방지 (0) | 2021.06.02 |