HTTPS<->HTTP 세션 공유
2010. 7. 7. 10:51ㆍ99. 정리전 - IT/11. Java
Tomcat 서버에서 로그인 페이지처럼 특정 페이지는 HTTPS를 이용하고, 나머지 페이지는 HTTP를 사용하려고 한다.
이때 HTTPS->HTTP로 이동하면서 세션은 공유되지 않는 문제가 있다. 다음은 이 문제를 해결하는 방법 중 하나이다.
RequestWrapper 클래스를 하나 만듭니다. 이 클래스는 HTTPS 요청일 경우 쿠키에 세션 정보를 조작하는 역할을
합니다.
public class
HttpsRequestWrapper extends HttpServletRequestWrapper{
private HttpServletResponse response = null;
public HttpsRequestWrapper (HttpServletRequest request) {
super(request);
}
public void setResponse (HttpServletResponse response) {
this.response = response;
}
public HttpSession getSession () {
HttpSession session = super.getSession();
processSessionCookie(session);
return session;
}
public HttpSession getSession (boolean create) {
HttpSession session = super.getSession(create);
processSessionCookie(session);
return session;
}
private void processSessionCookie (HttpSession session) {
if (null == response || null == session) return;
Object cookieOverWritten = getAttribute("COOKIE_OVERWRITTEN_FLAG");
if (null == cookieOverWritten && isSecure() && isRequestedSessionIdFromCookie() && session.isNew()) {
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(-1);
String contextPath = getContextPath();
if ((contextPath != null) && (contextPath.length() > 0)) {
cookie.setPath(contextPath);
} else {
cookie.setPath("/");
}
response.addCookie(cookie);
setAttribute("COOKIE_OVERWRITTEN_FLAG", "true");
}
}
}
private HttpServletResponse response = null;
public HttpsRequestWrapper (HttpServletRequest request) {
super(request);
}
public void setResponse (HttpServletResponse response) {
this.response = response;
}
public HttpSession getSession () {
HttpSession session = super.getSession();
processSessionCookie(session);
return session;
}
public HttpSession getSession (boolean create) {
HttpSession session = super.getSession(create);
processSessionCookie(session);
return session;
}
private void processSessionCookie (HttpSession session) {
if (null == response || null == session) return;
Object cookieOverWritten = getAttribute("COOKIE_OVERWRITTEN_FLAG");
if (null == cookieOverWritten && isSecure() && isRequestedSessionIdFromCookie() && session.isNew()) {
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(-1);
String contextPath = getContextPath();
if ((contextPath != null) && (contextPath.length() > 0)) {
cookie.setPath(contextPath);
} else {
cookie.setPath("/");
}
response.addCookie(cookie);
setAttribute("COOKIE_OVERWRITTEN_FLAG", "true");
}
}
}
그리고 Filter 클래스를 만듭니다. 이 필터는 기본 Request를 HttpsRequestWrapper로 변경하는 역할을 합니다. 그리고 이 필터는 다른 필터보다 우선 실행되어야 합니다.
public class HttpsFilter implements Filter{public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpsRequestWrapper httpsRequest = new HttpsRequestWrapper((HttpServletRequest)request);
httpsRequest.setResponse((HttpServletResponse)response);
chain.doFilter(httpsRequest, response);
}
}
출차 : http://woojongwon.tistory.com/19#comment1740230