2

Java Web アプリを Heroku で動作させるのに多くの問題があります。

これは私が持っているものです:

次のような web.xml の security-constraint セクションで Spring Security を使用する Java Web アプリ (標準の war ファイル):

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>SSL URLs</web-resource-name>
            <url-pattern>/j_spring_security_check</url-pattern>
            <url-pattern>/secure/account/create</url-pattern>
            <url-pattern>/register</url-pattern>
            <url-pattern>/login/*</url-pattern>
            <url-pattern>/</url-pattern> 
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint> 

WAR ファイルを (Atlassian Bamboo の Heroku デプロイ プラグインを使用して) Heroku にデプロイし、アプリを起動すると、ブラウザーに「リダイレクトが多すぎます」というエラーが表示されます。 https と http ですが、修正するために何をする必要があるのか​​ わかりません。

SSLアドオンは私の趣味のプロジェクトにはかなり高価なので(月額20ドル)、今のところはピギーバックSSLを使用したいだけです。

4

3 に答える 3

12

requires-channelSpring Security 構成と Tomcat の の組み合わせを使用して、同様の問題を解決しましたRemoteIpValve。Spring Security を使用していない場合は、構成RemoteIpValveするだけで十分です (以下ではwebapp-runner、コンテナーとして優れたものを使用していると想定しています) jetty-runner に相当するものがあると思いますが、わかりません...

問題は、Heroku の Web/ルーティング層が SSL を処理し、リクエストをプレーンな HTTP として Web アプリケーションにプロキシすることです。そのため、Tomcat は、要求が他の場所で保護されていることを認識しません (SSL オフロード)RemoteIpValveは、本質的に、Tomcat が認識する (そして、request.isSecure()評価される方法である) プロトコル、ポート、および IP アドレスを上書きします。 SSLを処理しました。

次を使用して を作成しcontext.xmlます。

<Context>
  <Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="x-forwarded-for" protocolHeader="x-forwarded-proto" portHeader="x-forwarded-port"/>
</Context>

これら 3 つのヘッダー ( x-forwarded-forx-forwarded-proto、およびx-forwarded-port) は、Heroku のルーティング層によって自動的に送信されます。

次に、ファイルが Maven ターゲット ディレクトリのどこかにコピーされることを確認します (ファイルwebapp-runner自体と同じディレクトリに配置します)。でpom.xml

<resources>
  <resource>
    <directory>${basedir}/src/main/resources/META-INF</directory>
    <includes>
      <include>context.xml</include>
    </includes>
    <targetPath>${project.build.directory}/dependency</targetPath>
  </resource>
</resources>

最後に、webapp-runner が context.xml を指していることを確認します (たとえば、context-xml引数をサポートする webapp-runner 7.0.30.1 を使用します)。あなたのProcfile

web: java $JAVA_OPTS -jar target/dependency/webapp-runner.jar --context-xml target/dependency/context.xml ...etc...

最後に、Spring Security を使用requires-channel<sec:intercept-url>て、環境変数を反転することで HTTP と HTTPS を切り替えます。構成を簡単にするためにローカルの開発ボックスで設定を解除し、Heroku で ( 経由でheroku config) 設定して、異なる環境で SSL を選択的に強制します。

これがうまくいくことを願っています...

于 2012-11-30T17:20:02.137 に答える
3

私はwebapp-runnerを使用してまったく同じ問題に直面していましたが、ここで--proxy-base-url https://example.com説明されているように、単にを使用して修正しました

于 2017-04-18T16:33:21.867 に答える