1

「SSL エンドポイント」アドオンを使用して Heroku にデプロイされた、組み込みの Jetty で実行される Java サーブレットがあります。ユーザーが http または https のどちらを使用してアプリに移動するかに関係なく、アプリ内のすべてのページを HTTPS 経由で提供する必要があります。

アプリケーションは https 経由で行われたリクエストを認識しますが、リダイレクトせずに http リクエストも受け入れます (これは行うべきではありません)。また、ユーザーが https 接続で開始した場合、フォームがポストされて「GET」リクエストにリダイレクトされるたびに、すべての https 接続が http に戻されます。

「http://」を「https://」に単純に変更し、次のコードを使用してリダイレクトする URL フィルターを追加してみました (簡潔にするためにインポートを削除しました)。

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>

どんな助けでも大歓迎です。

4

2 に答える 2

3

x-forwarded-protoヘッダーをチェックして、リクエストが安全かどうかを確認する必要があります。

Boolean secure = false;
if (request.headers.get("x-forwarded-proto") != null) {
  secure = request.headers.get("x-forwarded-proto").values.contains("https");
}
System.out.println("secure = " + secure);
于 2012-07-20T07:11:25.047 に答える
0

Heroku に確認しました (バージョンや buildpack などを見逃している可能性があります) が、間違いなく次の情報は得られませんでした。

  • X-Forwarded-Proto が http を指す
  • HttpServletRequest#scheme は http を返します
  • a HttpServletRequest#secure return false ....
于 2014-09-24T15:24:06.110 に答える