3

herokuでHTTPSを適用することについて多くの質問を見つけましたが、Javaについての応答はありません。

これが私が見つけたリンクです:

Scala:http ://www.andersen-gott.com/2012/03/using-unfiltered-and-https-on-heroku.html

Rails:Rails-http://example.comからhttps://www.example.comにリダイレクトする方法

私はSpringMVC3.1を使用しているので、WebMvcConfigurerAdapter.addInterceptors(InterceptorRegistryレジストリ)に基づくソリューションを好むことに注意してください。

4

4 に答える 4

6

以下は、https 以外のすべてのリクエストを https にリダイレクトするサーブレット フィルタです。

package com.jamesward;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HttpsEnforcer implements Filter {

    private FilterConfig filterConfig;

    public static final String X_FORWARDED_PROTO = "x-forwarded-proto";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        if (request.getHeader(X_FORWARDED_PROTO) != null) {
            if (request.getHeader(X_FORWARDED_PROTO).indexOf("https") != 0) {
                response.sendRedirect("https://" + request.getServerName() + (request.getPathInfo() == null ? "" : request.getPathInfo()));
                return;
            }
        }

        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // nothing
    }
}

Spring Interceptor で静的アセット (リソース) リクエストをインターセプトできなかったため、これをサーブレット フィルターとして実行しました。

完全なソース: https://github.com/jamesward/springmvc-https-enforcer

于 2012-08-10T23:09:40.363 に答える
2

遅い回答ですが、代替の構成駆動型アプローチは、前の回答で述べたのと同じプロキシヘッダー (など)を処理するTomcat と組み合わせてrequires-channel="https"、さまざまなタグで Spring Security を使用することです。バルブは、プロキシ ヘッダーに基づいて の動作を変更し、コネクタが実際に受信したプロトコルではなく、プロキシによって報告されたプロトコルを反映します。したがって、Do the Right Thing に依存する Spring などのフレームワークは、SSL がオフロードされたときに適切に動作します。<sec:intercept-url>RemoteIpValvex-forwarded-protoHttpServletRequest.isSecure()isSecure()

Heroku での SSL リダイレクトには、webapp-runner および Heroku で使用するためのバルブの構成に関する指示があります。

さらに、PropertyPlaceholderConfigurer値を環境オーバーライド可能にするために使用することをお勧めします。たとえば、Spring Security 構成では次のようになります。

<sec:intercept-url pattern="/api/**" requires-channel="${REQUIRES_CHANNEL}" access="..."/>

関連application-config.xmlするものには、次のようなものが含まれます。

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
  <property name="properties" ref="applicationProperties"/>
</bean>

<bean id="applicationProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
    <list>
      <value>classpath:/application-config.properties</value>
    </list>
  </property>
</bean>

このapplication-config.propertiesファイルはREQUIRES_CHANNEL=httpデフォルトでインクルードし、Heroku にデプロイするときheroku config:set REQUIRES_CHANNEL=httpsにオーバーライドするように設定します。

于 2012-11-30T19:43:02.380 に答える
-1

spring mvc に基づくソリューションは次のとおりです。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class ForceHerokuSsl extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         String proto = request.getHeader("x-forwarded-proto");
         return proto == null || "https".equalsIgnoreCase(proto);
    }
}

次に、構成で:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {

   public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new ForceHerokuSslInterceptor());
   }
}
于 2014-02-26T21:33:21.427 に答える