【转】HTTPS重定向到HTTP

时间:2024-04-14 22:58:13

转自:http://www.2cto.com/kf/201209/158531.html

一.场景:
  在企业内网应用,以及一些安全要求不高的网站会有一些https转http的需求,例如只是登陆https协议,其他请求都是走http协议,走http协议不再需要重新登陆一次。

二.解决方案
  Cookie时效:

  当cookie是secure的情况下,当服务器从https协议重定向到http协议后,这样的cookie就不会随请求发送到服务器。
  当cookie不是secure的情况下,当服务器从http协议重定向到https协议后,这样的cookie就不会随请求发送到服务器。
所以解决的方法就是在https认证后,除了构造一个secure的cookie(包含session id信息),同时构造一个非secure的cookie(包含session id信息),这样页面跳转后就一致保持session有效了,从而达到https重定向到http后不需要登陆的效果。

  图中没有详细描述web容器的跳转,仅仅想描述协议转换的实现过程。

主要点说明:

  重定向跳转在页面中实现,而不在Authenticator实现,也不在Filter实现,因为Response已经commit。

  Filter实现增加非Secure cookie的逻辑,代码:

[java]
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class HttpsCookieFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
final HttpServletRequest httpRequest = (HttpServletRequest) request;
final HttpServletResponse httpResponse = (HttpServletResponse) response;
final HttpSession session = httpRequest.getSession(false);
// servlet3
if (session != null) {
System.out.println("HttpsCookieFilter set session cookie:"
+ session.getId());
final Cookie cookie = new Cookie("JSESSIONID",
session.getId());
cookie.setMaxAge(-1);//no store
cookie.setSecure(false);
cookie.setPath(httpRequest.getContextPath());
cookie.setHttpOnly(true);
httpResponse.addCookie(cookie);
}
//servlet2
//httpResponse.addHeader(
// "Set-Cookie",
// "JSESSIONID=" + session.getId() + "; Path="
// + httpRequest.getContextPath() + "; HttpOnly");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}