출처 : http://blog.nekrs.com/195
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); } } |