我有一个使用Jetty Embedded用Java编写的REST应用程序,在Heroku环境中运行。我想强制所有流量通过HTTPS。关于如何实现这一点有一些很好的答案,例如this one和this one。但是,所有答案都需要从文件中读取TLS / SSL证书。我想使用Heroku的自动证书管理(详情here),以避免每年到期时更新证书。使用ACM意味着我无权访问证书文件。
有没有办法配置Jetty强制HTTPS而不从文件中读取证书,或者以某种方式仍然可以使用Heroku ACM?
答案 0 :(得分:1)
您可以使用实现doFilter
的servlet过滤器执行此操作:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
String protocol = req.getHeader("X-Forwarded-Proto");
if (protocol.equals("http")) {
String url = "https://" + req.getServerName() + req.getContextPath() + req.getServletPath();
if (req.getPathInfo() != null) {
url += req.getPathInfo();
}
System.out.println("Forwarding request to: " + url);
resp.sendRedirect(url);
} else {
System.out.println("Not forwarding protocol: " + protocol);
chain.doFilter(request, response);
}
}
这是a complete example using Tomcat,但原则是相同的。