HTTPS<->HTTP 세션 공유

2010. 7. 7. 10:5199. 정리전 - 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");
  }
 }
}

그리고 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