我们有一个 Java servlet,使用嵌入式 Jetty 运行,使用“SSL Endpoint”插件部署到 Heroku。我要求应用程序中的所有页面都通过 HTTPS 提供,无论用户是使用 http 还是 https 导航到我们的应用程序。
应用程序识别通过 https 发出的请求,但它也接受 http 请求而不进行重定向(它不应该这样做)。此外,如果用户从 https 连接开始,那么每当发布表单并重定向到“GET”请求时,任何 https 连接都会恢复为 http。
我尝试添加一个 URL 过滤器,将“http://”简单地更改为“https://”,并使用以下代码进行重定向(为简洁起见删除了导入):
public class UrlFilter implements Filter
{
protected FilterConfig filterConfig;
@Override
public void destroy(){}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String incomingUrl = httpRequest.getRequestURL().toString();
if ( (!httpRequest.isSecure()) && incomingUrl.contains(".webapps.stjude.org") )
{
String newUrl = incomingUrl.replace("http://", "https://");
httpResponse.sendRedirect(newUrl);
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
this.filterConfig = filterConfig;
}
}
然后,我将它添加到我的 web.xml 文件中:
<filter>
<filter-name>urlFilter</filter-name>
<filter-class>org.stjude.radio.ui.filters.UrlFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>urlFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这种方法的问题是应用程序返回“重定向过多”错误(重定向循环)。
我确信这个问题已经得到解决,但我无法终生找到我需要做些什么来完成这项工作。
顺便说一句,我也尝试将以下内容添加到 web.xml 中,但这只会导致请求失败。
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL Pages</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>PUT</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
任何帮助将不胜感激。