我还在我的 web.xml 中添加了 securityConstraint。使用 EB 与您的应用程序一起部署的库存 server.xml,您可以重定向到端口 8443。您可以手动编辑此文件,但它会在您的下一次部署中被吹走。研究建议在部署战争中包含一个 .ebextensions 文件,该文件将覆盖 server.xml 文件,但这会冒 AWS 将来更改 server.xml 中其他内容的风险。另一个问题是我希望相同的应用程序版本(从 jenkins 构建)在我的开发环境以及其他不一定需要/启用 ssl 的 EB 环境中工作。
所以我改变了路线并实现了一个 servlet 过滤器,它使用负载均衡器提供的两个标头
如果 X-Forward-Proto == http 那么你知道你需要转发,需要 x-forward-host 来构造完整的 url 以进行重定向(至少我最终是这样做的)。这是使用客户 PropertiesHelper 对其进行环境特定控制的过滤器
public class RedirectFilter implements Filter {
boolean firstTime = true;
boolean redirect = false;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (firstTime) {
PropertiesHelper propertiesHelper = SpringApplicationContext.getPropertiesHelper();
redirect = propertiesHelper.getBooleanProperty("redirectHttp");
firstTime = false;
}
if (!redirect) {
chain.doFilter(request, response);
return;
}
String protocol = req.getHeader("X-Forwarded-Proto");
if (null != protocol && protocol.equals("http")) {
String host = req.getHeader("x-forwarded-host");
String requestURI = req.getRequestURI();
String redirectUrl = "https://" + host + requestURI;
res.sendRedirect(redirectUrl);
return;
}
chain.doFilter(req, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
您使用 web.xml 中的条目启用过滤器,确保它与您拥有的其他过滤器的顺序正确
<filter>
<filter-name>httpsRedirectFilter</filter-name>
<filter-class>com.cars.platform.util.RedirectFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpsRedirectFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最后,您需要在负载均衡器上同时启用 http 和 https(端口 443)